1. 概述
swing组建通常被称做“轻量级组建”,它完全由Java编写,不依赖操作系统语言。他的类继承关系如下图:
JComponnt是swing组件存放的位置,常用的组件如下:
JFrame | 框架 |
JDialog | 对话框 |
JOptionPane | 对话框 |
JButton | 按钮 |
JCheckBox | 复选框 |
JComBox | 下拉框 |
JLabel | 标签 |
JRadioButton | 单选按钮 |
JList | 显示一组条目的组件 |
JTextField | 文本框 |
JPasswordField | 密码框 |
JTextArea | 文本区域 |
2. 常用的窗体
常用的窗体有两种,JFrame和JDialog
2.1 JFrame
JFrame是一个容器,他是各个组件的载体。在开发的过程中,我们通过继承java.swing.JFrame来创建要给窗体。
JFrame的窗体通常与组件和容器相关,在JFrame对象创建完成之后,需要调用 getContentPane() 方法将窗体转换成容器,然后在窗体中添加组件(通过 Container 类的 add() 方法)。如下代码:
JFrame frame = new JFrame(title);
Container container = frame.getContentPane();
container.add(new JButton("A"));
构造函数:
JFrame();
JFrame(String title); // 指定窗体标题
其他需要指定的内容:
① 设置可见 setVisible()
② 设置大小 setSize()
③ 设置关闭方式
DO_NOTHING_ON_CLOSE | 什么都不做,就将窗体关闭 |
DISPOSE_ON_CLOSE | 任何注册监听程序对象后,会自动隐藏,并释放窗体 |
HIDE_ON_CLOSE | 隐藏窗口 |
EXIT_ON_CLOSE | 退出应用程序,默认窗口关闭 |
2.2 JDialog
继承自java.awt.Dialog类。他是从一个窗体弹出来的另外一个窗体。他和JFrame类似,也需要调用getContentPane将窗体转换为容器。然后在容器中设置窗体的内容。
构造函数
JDialog();
JDialog(Frame f); // 指定父窗口
JDialog(Frame f, boolean modle); // 指定父窗口 + 类型
JDialog(Frame f, String title); // 指定父窗口 + 标题
JDialog(Frame f, String title, boolean modle); // 指定父窗口 + 标题 + 类型
3. 常用的面板
面板也是一种swing容器,他可以作为容器容器添加容纳其他的组件,但是他而已必须被加在一个容器内。
3.1 JPanel
JPanel就是一种最简单的面板,他继承自 java.awt.Container 类。
JPanel p1 = new JPanel(new GridLayout(1, 3, 10, 10)); // 生成一个面板
c.add(p1); // 将面板加入到另外的容器中
3.2 JScrollPane
JScrollPane是带滚动条的面板。因此,在碰到需要将一个大的组件放到一个较小的空间的时候,使用该面板。JScrollPane内只能添加一个组件;因此,如果需要将多个组件添加到一个JScrollPane中时,需要先将需要添加的组件添加到JPanel中,再将JPanel添加到JScrollPane中。
4. 常用的组件
4.1 标签组件
类:JLabel
作用:显示文本或者提示信息
构造函数:
JLabel();
JLabel(Icon icon); // 设置图标
JLabel(Icon icon, int aligment); // 设置图标 + 水平对齐方式
JLabel(String str, int aligment); // 设置文本 + 水平对齐方式
JLabel(String str, Icon icon, int aligment); // 设置文本 + 图标 + 水平对齐方式
4.2 图标
接口:Icon
作用:可以设置在按钮,标签等组建上。
接口必须实现的方法:
public int getIconHeight();
public int getIconWidth();
public void paintIcon(Component arg(), Graphics arg1, int arg2, int arg3); // 在指定坐标位置画图
有两个方法可以实现一个Icon,① 使用java.awt.Graphics类提供的功能来画图;② 使用 Java支持的图片文件类型进行创建。
① 使用java.awt.Graphic类提供的功能来画图
class MyIcon implements Icon {
private int width;
private int height;
public int getIconHeight() {
return height;
}
public int getIconWidth() {
return width;
}
public MyIcon(int width, int height) {
this.width = width;
this.height = height;
}
public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
arg1.fillOval(x, y, width, height);
}
};
② 使用 Java支持的图片文件类型进行创建。
实用类 javax.swing.ImageIcon 类来根据现有的图片创建图标,该类也是实现了Icon接口。
构造函数:
ImageIcon();
ImageIcon(Image image); // 从图片创建图标
ImageIcon(Image image, String description); // 指定了图片 + 描述
ImageIcon(URL url);
4.3 按钮
类:JButton
构造方法:
JButton();
JButton(String text); // 指定文字
JButton(Icon icon); // 指定图标
JButton(String text, Icon icon); // 指定文字 + 图标
其他方法:
setTooltipText(String text); // 设置提示文字
setBorderPainted(); // 设置边界是否显示
setEnabled(); // 设置按钮是否可用
4.4 单选按钮组件
类:JRadioButton, ButtonGroup
说明:JRaddioButton是一个单选按钮,需要将单选按钮加入到按钮组中。
构造方法:
JRadioButton();
JRadioButton(Icon icon); // 指定图标
JRadioButton(Icon icon, bollean selected); // 指定图标 + 是否选中
JRadioButton(String text); // 指定文字
JRadioButton(String text, Icon icon); // 指定文字 + 图标
JRadioButton(String text, Icon icon, boolean selected); // 指定文字 + 图标 + 是否选中
示例:
JRadioButton apple = new JRadioButton("apple");
JRadioButton banana = new JRadioButton("banana");
ButtonGroup group = new ButtonGroup();
group.add(apple);
group.add(banana);
4.5 复选组件框
类:JCheckBox
构造方法:
JCheckBox();
JCheckBox(Icon icon, boolean checked); // 指定图标 + 是否被选中
JCheckBox(String text, boolean checked); // 指定文字 + 是否被选中
4.6 下拉列表框组件
类:JComboBox
构造方法:
JComboBox();
JComboBox(ComboBoxModel dataModel); // 使用listModel建立一个下拉列表
JComboBox(Object[] arrayData);
JComboBox(Vector vector);
当使用ComboBoxModel建立一个下拉列表的时候,需要实现该接口,该接口中有如下的函数需要实现:
public void setSelectedItem(Object item);
public Object getSelectedItem();
getSize();
getElementAt(int index);
4.7 列表框组件
类:JList
构造方法:
JList();
JList(Object[] listObj);
JList(Vector listData);
JList(ListModel dataModel);
其他方法:
setListData(); // 设置list中的内容
其他:
对于使用ListModel构造的方法,通常,为了不完全实现ListModel中的接口,我们可以是下你一个类继承自该接口的抽象类AbstractListModel,这个类中提供了 getElementAt() 和 getSize() 方法。
4.8 文本组件
类:JTextField
构造函数:
JTextField();
JTextField(String text); // 指定默认文字
JTextField(int fieldWidth); // 指定文本框长度
JTextField(String text, int fieldWidth); // 指定默认文字 + 文本框长度
JTextField(Document docModel, String text, int fieldWidth); // 指定文本框模式 + 默认文字 + 文本框长度
4.9 密码框组件
类:JPasswordField
构造函数:
JPasswordField();
JPasswordField(String str); // 指定默认文字
JPasswordField(int fieldWidth); // 指定文本框长度
JPasswordField(String text, int fieldWidth); // 指定默认文字 + 文本框长度
JPasswordField(Document docModel, String text, int fieldWidth); // 指定文本框模式 + 默认文字 + 文本框长度
其他常用方法:
setEchoChar('*'); // 设置回显字符
4.10 文本域组件
类:JTextArea
构造函数:
JTextArea();
JTextArea(String text); // 指定默认文字
JTextArea(int rows, int cols); // 指定长 + 宽
JTextArea(Document doc); // 指定文本模型
JTextArea(Document doc, String text, int rows, int cols); // 指定文本模型 + 默认文字 + 长 + 宽
其他常用方法:
setLineWrap(); // 设置文本域是否自动换行
5. 常用的布局
4.1 绝对布局
绝对布局就是强行指定组件的大小和位置。在使用的时候,先取消掉原来的布局(如果没有设置布局,默认为边界布局);再为每个组件设置大小和位置。
Container.setLayout(null); // 取消布局管理
Component.setBounds(); // 设置每个组件的大小和位置
4.2 流布局 FlowLayout
所有组件像流一样,一个一个排放,排满了一行之后排下一行。默认情况下,每个组件是剧中排列的,但是也可以设置。
流布局的构造方法:
FlowLayout();
FlowLayout(int aligment); // 设置对齐方式
FlowLayout(int aligment, int horizGap, int vertGap); // 设置对齐方式 + 上下偏移
aligment取值:
FlowLayout.LEFT = 0
FlowLayout.CENTER = 1
FlowLayout.RIGHT = 2
通过setLayout函数来设置布局:
setLayout(new FlowLayout(FlowLayout.Right, 10, 10);
4.3 边界布局 BorderLayout
边界布局是默认的布局管理方式,边界布局将容器分成了东(BorderLayout.NORTH)、南(BorderLayout.SOUTH)、西(BorderLayout.EAST)、北(BorderLayout.WEST)、中(BorderLayout.CENTER)5个区域。
在给容器 add 组件的时候,指定边界
setLayout(new BorderLayout()); // 设置布局管理方式为边界布局
// ...
containe.add(BorderLayout.CENTER, new JButton("CENTER BUTTON")); // 在中心区域添加一个按钮
4.4 网格布局管理器
网格布局是将容器划分为网格;所有的组件都按照行和列排列,网格的个数由行数和列数决定。每个组件会填满空格,改变容器的大小,组件的大小也会随之改变。
构造方法:
GridLayout(int rows, int columns); // 指定行数,列数
GridLayout(int rows, int columns, int horizGap, int vertGap); // 指定行数 + 列数 + 水平间隔 + 垂直间隔
使用setLayout将容器设置为网格布局管理。在添加组件的时候,将按照网格中的空格去排布。对于跨行跨列的,或者如果我们希望更加灵活一些的话,我们可以在网格布局中添加JPanel,在JPanel中设置自己的网格布局。
6 常用的事件鉴听器
一个事件模型中有三个对象:事件源,时间,以及监听程序。事件源就是触发事件的对象,通常是一个SWING组件,他被监听器接受之后,进行相关的处理。常用的时间如下表:
| 事件 | 时间源 | 监听接口 | 方法 |
动作事件监听器 | ActionEvent | JButton, JList, JTextField 等 | ActionListener | addActionListener(), removeActionListener() |
焦点事件监听器 | FocusEvent | Component及其派生 | FocusListener | addFocusListener(), removeFocusListener() |