发布于 

Java简单图形编程

  今天这篇博客,讲的是部分 Java GUI 图形界面的用法,在开发一些需要服务端和客户端进行通信时,我们常常会写个界面,这时候做 java 后台的可能对图形界面比较陌生,所以在此我要简单聊一聊常见图形界面布局的方法。主要讲网格布局边界布局

Java GUI 两个比较常用的布局方法

网格布局 (GridLayout)

  先上代码,代码中有详细注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package gridlayout;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Demo1 extends JFrame {
//定义个控件
private JPanel[] ps = new JPanel[5]; //定义并分配了空间,没分配空间就操作会报空指针异常
private JLabel l1, l2, l3, l4;
private JTextField tf1;
private JPasswordField pwf1;
private JButton btn1, btn2;
private JRadioButton rb1, rb2;
private JCheckBox cb1, cb2;
private ButtonGroup bg1, bg2;

public Demo1() {
//初始化各控件
for (int i = 0; i < ps.length; i++) {
ps[i] = new JPanel();
}
l1 = new JLabel("用户名:");
l2 = new JLabel("密码:");
l3 = new JLabel("性别:");
l4 = new JLabel("爱好:");
tf1 = new JTextField(15);
pwf1 = new JPasswordField(15);
btn1 = new JButton("登录");
btn2 = new JButton("取消");
rb1 = new JRadioButton("男");
rb2 = new JRadioButton("女");
bg1 = new ButtonGroup(); //使用单选按钮时,要使用ButtonGroup!复选按钮(框)不用!
bg1.add(rb1);
bg1.add(rb2);
cb1 = new JCheckBox("唱歌");
cb2 = new JCheckBox("跳舞");

//设置布局,LayoutManager manager = new GridLayout(行rows,列cols);
setLayout(new GridLayout(5, 1));

//控件添加到面板Jpanel
ps[0].add(l1);
ps[0].add(tf1);
ps[1].add(l2);
ps[1].add(pwf1);
ps[2].add(l3);
ps[2].add(rb1); //注意:不能添加bg1,它算是对象的容器
ps[2].add(rb2);
ps[3].add(l4);
ps[3].add(cb1);
ps[3].add(cb2);
ps[4].add(btn1);
ps[4].add(btn2);

for (int i = 0; i < ps.length; i++) {
add(ps[i]);//或写成this.add(ps[i]));原因见下
}

//用匿名内部类来监听事件源产生的事件
btn2.addActionListener(new ActionListener() {
//实现ActionListener的actionPerformed方法
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "即将关闭"); //弹出提示框
dispose(); //dispose方法是关闭窗体,并释放一部分资源
}
});

//设置JFrame窗体的各属性,(注:因为这些都是父类JFrame的方法,没有歧义时,我就省略了this,不想写一些多余的)
setTitle("GridLayout测试");
setSize(500, 400);
setLocation(300, 100);
setVisible(true); //设置窗体可见,不能忘了!
//使用 System exit 方法退出应用程序。仅在应用程序中使用。如果不写,控制台会一直运行,不会退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
}
}

  运行效果图:

  上面主要的思想是,每行可以放一个 JPanel 面板容器,里面又可以添加控件或容器,然后做成你想要的几行几列的网格布局。

边界布局 (BorderLayout)

  1、布局方位:
  


  2、注意控件会自动调整:
  1)北和南位置控件各占上、下一行,控件宽度将自动布满整行。
  2)东、西和中间三个位置控件共占中间一行。
  3)东南西北四个位置,不管哪里缺了控件,中间的控件都会自动占据那里。
  具体效果大家可以自己去试试,下面看看我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package borderlayout;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class Demo2 extends JFrame {
private JLabel l1;
private JTextArea ta1;
private JScrollPane sp1;
private JComboBox<String> cb1;
private JTextField tf1;
private JButton btn1;
private JPanel p1;

public Demo2() {
//初始化
l1 = new JLabel("聊天界面");
ta1 = new JTextArea(); //不写参数,会自动调节大小
sp1 = new JScrollPane(ta1);
String[] strs = {"非匿名", "匿名"};
cb1 = new JComboBox<String>(strs);
tf1 = new JTextField(15);
btn1 = new JButton("发送");
p1 = new JPanel();

p1.add(cb1);
p1.add(tf1);
p1.add(btn1);

add(l1, BorderLayout.NORTH);
add(sp1, BorderLayout.CENTER);
add(p1, BorderLayout.SOUTH);

setTitle("BorderLayout测试");
setSize(500, 400);
setLocation(300, 100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
}
}


  运行效果图:

  上面就是中间的控件自动占据了东、西俩位置,因为就东、西俩位置没控件。

JOptionPane 消息提示框

  因为我们在写界面时,可能会要弹出一些提示框,上面的第一个例子就用到了,在此我简单介绍一下三种消息常用的提示框方法(其实有四种,这三种比较常用和简单):
  1、showConfirmDialog   询问确认问题,如是 / 否 / 取消。
  2、showInputDialog     提示输入一些内容。
  3、showMessageDialog    告诉用户发生了什么事。
  简单的用法就是这样:JOptionPane.showMessageDialog(null,” 要显示的文字”),把 showMessageDialog 换成你想要的方法即可。如果想要详细学习 JOptionPane 的用法,可以参考官方文档, 是英文的,英文不好的童鞋记得用下谷歌浏览器自带的翻译。好了图形界面的简单编程就讲到这,拜拜了!