Flow 布局
下面代码通过一个简单的Flow布局程序介绍基本的Java GUI程序写法:
package gui;
import java.awt.*;
import javax.swing.*;
public class Frame1 extends JFrame {
public Frame1(String title) {
super(title);
Container container = getContentPane(); // 获取框架内容窗格
container.add(new JButton("确定"));
container.add(new JButton("取消"));
// **** 窗口设置 ****
// remove(btn); // 移除组件
setVisible(true); // 设置窗口是否可见
setSize(300, 200); // 设置窗口尺寸
setLocation(400, 400); // 设置窗口的位置
// setBounds(x, y, width, height); // 等效于上面两个方法
setResizable(false); // 设置窗口是否可以缩放
// dispose(); // 撤销和释放当前窗口
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置窗口关闭方式
FlowLayout flow_layout = new FlowLayout(FlowLayout.LEFT); // 创建浮动布局对象
setLayout(flow_layout); // 设置布局
}
public static void main(String[] args) {
Frame1 f = new Frame1("空洞骑士");
}
}
Border 布局
上北下南左西右东,外加一个中间。
package gui;
import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
public Frame2(String title) {
super(title);
Container container = getContentPane(); // 获取框架内容窗格
// **** 窗口设置 ****
setVisible(true); // 设置窗口是否可见
setSize(300, 200); // 设置窗口尺寸
setLocation(400, 400); // 设置窗口的位置
setResizable(false); // 设置窗口是否可以缩放
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置关闭后销毁程序
setLayout(new BorderLayout()); // 设置布局
// **** 添加组件 ****
container.add(new JButton("EAST"), BorderLayout.EAST);
container.add(new JButton("WEST"), BorderLayout.WEST);
container.add(new JButton("SOUTH"), BorderLayout.SOUTH);
container.add(new JButton("NORTH"), BorderLayout.NORTH);
container.add(new JButton("CENTER"), BorderLayout.CENTER);
}
public static void main(String[] args) {
Frame2 f = new Frame2("空洞骑士");
}
}
Grid 布局
网格布局,和CSS中的Grid差不多。
package gui;
import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
public Frame2(String title) {
super(title);
Container container = getContentPane(); // 获取框架内容窗格
// **** 窗口设置 ****
setVisible(true); // 设置窗口是否可见
setSize(300, 200); // 设置窗口尺寸
setLocation(400, 400); // 设置窗口的位置
setResizable(false); // 设置窗口是否可以缩放
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置关闭后销毁程序
setLayout(new GridLayout(3, 4)); // 设置布局
// **** 添加组件 ****
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
container.add(new JButton("小骑士"));
}
public static void main(String[] args) {
Frame2 f = new Frame2("空洞骑士");
}
}
null 布局
使用每个组件的setBounds()进行绝对定位。
package gui;
import java.awt.*;
import javax.swing.*;
public class Frame2 extends JFrame {
public Frame2(String title) {
super(title);
Container container = getContentPane(); // 获取框架内容窗格
// **** 窗口设置 ****
setVisible(true); // 设置窗口是否可见
setSize(300, 200); // 设置窗口尺寸
setLocation(400, 400); // 设置窗口的位置
setResizable(false); // 设置窗口是否可以缩放
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置关闭后销毁程序
setLayout(null); // 设置布局
// **** 添加组件 ****
JButton button = new JButton("小骑士");
container.add(button);
button.setBounds(30, 10, 100, 50);
}
public static void main(String[] args) {
Frame2 f = new Frame2("空洞骑士");
}
}
常用组件
- Jlabel(标签)
- JTextField(文本框)
- JTexArea(文本区/文本域)
- Jbutton(按钮)
- JPanel(面板)
- JCheckBox(选择框/复选框)
- JRadioButton(单选按钮)
- JComboBox(下拉列表)
- JPasswordField(密码框)
下面通过一个大杂烩来引入:
package gui;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
public class Frame2 extends JFrame {
public Frame2(String title) {
super(title);
Container container = getContentPane(); // 获取框架内容窗格
// **** 添加组件 ****
// 菜单组件
String[] items = {"吉欧", "泪水之城"};
JComboBox combo = new JComboBox(items);
combo.addItem("十字路口");
container.add(combo);
// 文本输入框组件
container.add(new TextField("请输入文本...", 5));
container.add(new JButton("小骑士"));
// 单选按钮组合
ButtonGroup group = new ButtonGroup();
JRadioButton btn1 = new JRadioButton("假骑士");
JRadioButton btn2 = new JRadioButton("真骑士");
group.add(btn1);
group.add(btn2);
container.add(btn1);
container.add(btn2);
// 文本区域
container.add(new JTextArea("输入..", 3, 11));
// 设置窗口的可见需要放到最后
setSize(400, 300); // 设置窗口尺寸
setLocation(400, 400); // 设置窗口的位置
setResizable(false); // 设置窗口是否可以缩放
setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置关闭后销毁程序
container.setLayout(new FlowLayout()); // 设置布局
setVisible(true); // 设置窗口是否可见
// 密码框
container.add(new JLabel("密码:"));
container.add(new JPasswordField(20));
// 复选框
container.add(new JCheckBox("前端"));
container.add(new JCheckBox("游戏开发"));
}
public static void main(String[] args) {
Frame2 f = new Frame2("空洞骑士");
}
}
Panel 面板
package gui;
import java.awt.*;
import javax.swing.*;
public class Frame3 extends JFrame {
Frame3() {
super("空洞骑士");
Container container = getContentPane();
container.setLayout(new BorderLayout());
JPanel p1 = new JPanel(new GridLayout(1, 1));
JPanel p2 = new JPanel(new GridLayout(5, 7));
container.add(p1, BorderLayout.NORTH);
container.add(p2, BorderLayout.CENTER);
p1.add(new JButton("讲台"));
// 向 p2 中加入九个按钮
for (int i = 0; i <= 34; i ++) {
p2.add(new JButton("座位" + String.valueOf(i)));
}
setSize(550, 700);
setResizable(false);
setLocation(400, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Frame3 f = new Frame3();
}
}
实现效果:
事件
为btn
这个按钮添加一个事件绑定,原理为使用匿名函数实现接口。
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for (JTextField tf : all_text) {
tf.setText("");
}
}
});
综合项目
实现一个简单的计算功能:
package gui;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Frame5 extends JFrame {
Frame5() {
super("求根公式");
Container con = getContentPane();
con.setLayout(new GridLayout(7, 2));
con.add(new JLabel("a"));
JTextField a = new JTextField();
con.add(a);
con.add(new JLabel("b"));
JTextField b = new JTextField();
con.add(b);
con.add(new JLabel("c"));
JTextField c = new JTextField();
con.add(c);
con.add(new JLabel("点此清空"));
JButton clear = new JButton("清空");
con.add(clear);
con.add(new JLabel("点此求解"));
JButton solve = new JButton("求解");
con.add(solve);
con.add(new JLabel("x1"));
JTextField x1 = new JTextField();
con.add(x1);
con.add(new JLabel("x2"));
JTextField x2 = new JTextField();
con.add(x2);
// 所有文本框数组
JTextField[] all_text = {a, b, c, x1, x2};
// 清空接口实现
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for (JTextField tf : all_text) {
tf.setText("");
}
}
});
// 求解接口实现
solve.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// 利用正则表达式匹配防止输入非数字时控制台报错
if (!isNumber(a.getText()) || !isNumber(b.getText()) || !isNumber(c.getText())) return;
double A = Double.parseDouble(a.getText());
double B = Double.parseDouble(b.getText());
double C = Double.parseDouble(c.getText());
// System.out.println("sum:"+(A+B+C));
if (A == 0 || (B*B-4*A*C) < 0) {
x1.setText("###");
x2.setText("###");
} else {
x1.setText("" + ((-B + Math.sqrt(B*B-4*A*C)) / 2 * A) );
x2.setText("" + ((-B - Math.sqrt(B*B-4*A*C)) / 2 * A) );
}
}
});
// 窗口预设
setVisible(true);
setSize(350, 350);
setLocation(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static boolean isNumber(String str) {
if (str != null && str.matches("-?\\d+(\\.\\d+)?")) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
Frame5 f = new Frame5();
}
}