1. 概述

swing组建通常被称做“轻量级组建”,它完全由Java编写,不依赖操作系统语言。他的类继承关系如下图:

SWING限制输入范围 java java swing用法_ico

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()