Swing程序设计

Swing框架主要用于开发GUI(Graphical User Interface)程序。

摘录自《Java 从入门到精通》、《Java核心技术 卷1》

Swing框架主要用于开发GUI(Graphical User Interface)程序。

Swing组件完全由Java语言编写,不依赖域本地平台(即操作系统),因此Swing组件可以被应用于任何平台。基于“跨平台”这一特性,Swing组件被称为“轻量级组件”。

设计模式

Swing采用模型-视图-控制器模式model-view-controller),遵循面对对象设计中的一个基本原则:限制一个对象所拥有的功能数量。在模型-视图-控制器模式(MVC)中实现三个独立的类:

  • 模型model):存储内容
  • 试图view):显示内容
  • 控制器controller):处理用户输入

模型 -视图 -控制器模式的一个优点是一个模型可以有多个视图, 其中每个视图可以显示全部内容的不同部分或不同形式。

窗体

JFrame窗体

JFrame方法

1
2
JFrame()
JFrame(String title)

–创建一个初始不可见,有或无标题的窗体。

1
Container getContentPane()

–得到JFrame窗体对应的Container容器。

窗体设置

1
2
3
setBounds(int x, int y, int width, int height)
setLocation(int x, int y)
setSize(int width, int height)

–设置窗体左上角在屏幕中的坐标为(x, y),窗体的宽度为width,窗体的高度为height。

1
setVisiable(boolean b)

–设置窗体是否可见,默认为false。

1
setDefaultCloseOperation(int operation)

–设置窗体的关闭方式,默认值为DISPOSE_ON_CLOSE

DO_NOTHING_ON_CLOSE 关闭窗体时,不触发任何操作
DISPOSE_ON_CLOSE 关闭窗体时,释放窗体资源,窗体会消失但程序不终止
HIDE_ON_CLOSE 关闭窗体时,仅隐藏窗体,不释放资源
EXIT_ON_CLOSE 关闭窗体时,释放资源并关闭程序

JDialog对话框

JDialog对话框继承自Dialog类,其功能是从一个窗体中弹出另一个窗体

JDialog方法

1
JDialog(Frame f, String title, boolean model)

–创建一个指定父窗体、标题、模式的对话框。(可缺)

如果model为true,那么弹出对话框之后用户无法操作窗体。

JOptionPane小型对话框

该类用于创建对话框的方法都是静态方法,无需创建对象即可弹出。

自定义对话框

1
2
3
4
static int showOptionDialog(Component parentComponent, 
Object message, String title,
int optionType, int messageType,
Icon icon, Object[] options, Object initialValue)

其中参数说明:

  • parentComponent: 指明对话框在哪个窗体之上显示(居中),若传入null则在屏幕中间弹出对话框
  • message:提示的信息
  • title:对话框标题
  • optionType:指定可用于对话框的选项的整数:DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION, OK_CANCEL_OPTION
  • messageType: 指定消息种类的整数,主要用于确定来自可插入外观的图标:ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE, PLAIN_MESSAGE\
  • icon: 对话框中显示的图标
  • options:指示用户可能选择的对象组成的数组
  • initialValue:在使用option时表示对话框的默认选择对象,可以为null

确认框

确认框已经封装好了一套外观样式,弹出后要求用户做选择操作,用户选择具体选项后,确认框可以返回用户的选择结果,结果以int方式返回。

1
2
3
4
static int showConfirmDialog(Component parentComponent, 
Object message, String title,
int optionType, int messageType,
Icon icon)

输入框

输入框已经封装好了一套外观样式,弹出后要求用户在文本框中输入文本,用户完成输入操作后,输入框可以返回用户输入的结果。

1
2
3
4
5
static String showInputDialog(Component parentComponent, 
Object message, String title,
int optionType, int messageType,
Icon icon,
Object[] selectionValues, Object initialSelectionValue)

通知框

通知框是最简单的一类对话框,仅弹出提示,而不会返回任何值。

1
2
3
static void showMessageDialog(Component parentComponent, 
Object message, String title,
int messageType, Icon icon)

布局管理

通常,组件放置在容器中, 布局管理器决定容器中的组件具体放置的位置和大小。

按钮文本域和其他的用户界面元素都继承于Component 类, 组件可以放置在面板这样的容器中。由于 Container 类继承于 Component 类,所以容器也可以放置在另一个容器中。

每个容器都有一个默认的布局管理器,但可以重新进行设置。可以往容器中添加组件容器的*add()*方法将把组件和放置的方位传递给布局管理器

容器

1
void setLayOut(LayoutManager m)

–为容器设置布局管理器。

1
2
Component add(Component c)
Component add(Component c, Object constraints)

–将组件添加到容器中,并返回组件的引用。

constraints为布局管理器理解的标识符。

1
void remove(Component c)

–删除容器中的组件

绝对布局

绝对布局也叫null布局,其特点是硬性指定组件在容器中的位置和大小,组件的位置通过绝对坐标的方式来指定。使用绝对布局首先要使用*Container.setLayout(null)方法取消容器的布局管理器,然后再使用Component.setBounds(int x, int y, int width, int height)*方法设置每个组件在容器中的位置和大小。

流布局

流布局(FlowLayout)管理器是 Swing中最基本的布局管理器。使用流布局管理器摆放组件时,组件被从左到右摆放。当组 件占据了当前行的所有空间时,溢出的组件会被移动到当前行的 两个下一行。

1
2
3
FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hgap, int vgap)

–构造一个新的 FlowLayout 对象。

align参数指LEFT, CENTER, RIGHT

hgap参数指以像素为单位的水平间距

vgap参数指以像素为单位的垂直间距

边框布局

边框布局管理器border layout manager) 是每个JFrame的内容窗格的默认布局管理器。

流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。可以选择把组件放在内容窗格的中部、 北部、南部、 东部或者西部。

边框布局先放置边缘组件,剩余的可用空间由中间组件占据。当容器被缩放时,边缘组件的尺寸不会改变,而中部组件的大小会发生变化。在添加组件时可以指定 BorderLayout 类中的 CENTERNORTHSOUTHEASTWEST 常量。并非需要占用所有的位置,如果没有提供任何值,系统默认为 CENTER

与流布局不同,边框布局会扩展所有组件的尺寸以便填满可用空间(流布局将维持每个组件的最佳尺寸),此时直接将按钮添加到容器中会出现问题。解决这个问题的常见方法是使用另外一个面板(panel)

1
2
BorderLayout()
BorderLayout(int hgap, int vgap)

–构造一个新的 BorderLayout 对象。

hgap参数指以像素为单位的水平间距

vgap参数指以像素为单位的垂直间距

网格布局

网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的。

1
2
GridLayout(int rows, int columns)
GridLayout(int rows, int columns, int hgap, int vgap)

–构造一个新的 GridLayout 对象。rows 或者 columns 可以为零, 但不能同时为零,指定的每行或每列的组件数量可以任意的。

rows指网格的行数

columns指网格的列数

hgap参数指以像素为单位的水平间距

vgap参数指以像素为单位的垂直间距

面板

在Swing程序设计中,面板是一个容器,被用于容纳其他组件,但面板必须被添加在其他容器中。

面板JPanel

……..

滚动面板JScrollPanel

在Swing中,文本区没有滚动条。如果需要滚动条,可以将文本区插人到滚动面板(JScrollPanel) 中。

JScrollPanel滚动面板不能使用布局管理器,同时只能容纳一个组件。如果需要在一个JScrollPanel滚动面板中添加多个组件,那么可以先将多个组件添加到JPanel面板。

例:

1
2
JTextArea textArea = new JTextArea(8, 40);
JScrollPane scrollPane = new JScratlPane(textArea):

现在滚动窗格管理文本区的视图。如果文本超出了文本区可以显示的范围, 滚动条就会自动地出现, 并且在删除部分文本后,当文本能够显示在文本区范围内时, 滚动条会再次自动地消失。滚动是由滚动窗格内部处理的, 编写程序时无需处理滚动事件。这是一种为任意组件添加滚动功能的通用机制, 而不是文本区特有的。也就是说, 要想为组件添加滚动条, 只需将它们放人一个滚动窗格中即可。

文本输入

文本域JTextField

文本域JTextField) 和文本区JTextArea) 组件用于获取文本输入,文本域只能接收单行文本的输入,而文本区能够接收多行文本的输入。JPassword也只能接收单行文本的输入,但不会将输入的内容显示出来。

这三个类都继承于JTextComponent类(抽象类)。

JTextComponent方法

1
2
String getText()
void setText(String text)

–获取或设置文本组件中的文本。

1
2
boolean isEditable()
void setEditable(boolean b)

–获取或设置editable特性, 这个特性决定了用户是否可以编辑文本组件中的内容

JTextField方法

1
JTextField(int cols)

–构造一个给定列数的空JTextField对象。

1
JTextField(String text, int cols)

–构造一个给定列数、给定初始字符串的JTextField对象。

1
2
int getColumns()
void setColumns(int cols)

–获取或设置文本域使用的列数。

1
void revalidate()

–重新计算组件的位置和大小

使用 *setColumns()方法改变了一个文本域的大小之后, 需要调用包含这个文本框的容器revalidate()方法。revalidate()方法会重新计算容器内所有组件的大小,并且对它们重新进行布局。调用revalidate()*方法以后, 布局管理器会重新设置容器的大小, 然后就可以看到改变尺寸后的文本域了。

1
void validate()

–重新计算组件的位置和大小(对JFrame组件)(JFrame没有扩展JComponent,无法使用revalidate

1
2
Font getFont()
void setFont(Font f)

–设置组件的字体。

标签JLabel

标签是容纳文本的组件,它们没有任何的修饰(例如没有边缘),也不能响应用户输入。可以利用标签标识组件。

JLabel 的构造器允许指定初始文本和图标, 也可以选择内容的排列方式。可以用 SwingConstants 接口中的常量来指定排列方式。在这个接口中定义了几个很有用的常量, 如 LEFT、RIGHT、CENTER、 NORTH、 EAST 等。

可以在按钮、标签和菜单项上使用无格式文本或 HTML 文本。

JLabel方法

1
2
3
4
Jlabel(String text)
JLabel(Icon icon)
Jlabel(String text, int align)
Jlabel(String text, Icon icon, int align)

构造一个标签。

text为参数中的文本,icon为标签中的图标,align为一个SwingConstants的常量LEFT(默认)、CENTER、RIGHT。

1
2
String getText()
void setText(String text)

获取或设置标签的文本。

1
2
Icon getIcon()
void setIcon(Icon icon)

获取或设置标签的图标。

密码域JPasswordField

密码域是一种特殊类型的文本域。为了避免有不良企图的人看到密码, 用户输入的字符 不显示出来。每个输人的字符都用回显字符( echo character) 表示, 典型的回显字符是星号(*)。Swing 提供了 JPasswordField 类来实现这样的文本域。

JPasswordField方法

1
JPasswordField(String text, int columns)

构造一个新的密码域对象。

1
void setEchoChar(char echo)

为密码域设置回显字符。注意:独特的观感可以选择自己的回显字符。0 表示重新设置为默认的回显字符。

1
char[] getPassword()

返回密码域中的文本。为了安全起见, 在使用之后应该覆写返回的数组内容(密码并不是以String的形式返回,这是因为字符串在被垃圾回收器回收之前会一直驻留在虚拟机中)。

文本区JTextArea

有时, 用户的输人超过一行, 需要使用JTextArea组件来接收这样的输入。当在程序中放置一个文本区组件时,用户就可以输人多行文本,并用 ENTER 键换行。每行都以一个“ \n” 结尾。

JTextArea方法

1
2
3
JTextArea()
JTextArea(int rows, int cols)
JTextArea(String text, int rows, int cols)

构造一个新的文本区对象。

1
2
void setColumns(int cols)
void setRows (int rows)

设置文本区应该使用的首选列数、行数。

1
void append(String newText)

将给定的文本追加到文本区中已有文本的尾部。

1
void setLineWrap(boolean wrap)

打开或关闭换行。

如果文本区的文本超出显示的范围, 那么剩下的文本就会被剪裁掉。 可以通过开启换行特性来避免裁剪过长的行,但换行只是视觉效果;文档中的文本没有改变,在文本中并没有插入“ \n” 字符。

1
void setWrapStyleWord(boolean word)

如果word是true, 超长的行会在字边框处换行。如果为false, 超长的行被截断而不考虑字边框。

按钮

在Swing程序设计中,按钮是较为常见的组件,被用于触发特定的动作。Swing提供了多种按钮组件:按钮、单选按钮、复选框等

按钮JButton

1
JButton(String text, Icon icon)

–创建一个JButton对象

1
2
void setIcon(Icon icon)
void setToolTipText(String text)

–设置图标与提示文字

1
void setBorderPainted(boolean b)

–如果b的值为 true 且按钮有边框,那么绘制边框。borderPainted 属性的默认值为 true

1
void setEnabled(boolean b)

–设置按钮是否可用。b的值为true时,表示按钮可用;b的值为false时,表示按钮不可用。

1
void setFocusable(boolean b)

–设置按钮在按下后是否留有焦点(白色虚线框)

单选按钮JRadioButton

在Swing程序设计中,需要把多个单选按钮添加到按钮组,当用户选中某个单选按钮时,按钮组中的其他单选按钮将不
能被同时选中。

JRadioButton方法

1
JRadioButton(String text, Icon icon, boolean selected)

–构造一个JRadioButton对象

selected指定默认选择状态

按钮组ButtonGroup

按钮组ButtonGroup对象表示,多个单选按钮被添加到按钮组之后,就能实现“选项有多个,但只能选中一个”的效果。

1
2
ButtonGroup()
void add(JRadioButton button)

–构造一个ButtonGroup对象并向其中添加button

复选框JCheckBox

复选框组件由JCheckBox对象表示。与单选按钮不同的是,窗体中的复选框可以被选中多个,是因为每一个复选框都提供“被选中”和“不被选中”两种状态。

1
JCheckBox(String text, boolean checked)

–构造一个JCheckBox对象

列表

Swing 中提供两种列表组件,分别为下拉列表框 (JComboBox)与列表框 (JList)。下拉列表框与列表框都是带有一系列列表项的组件,用户可以从中选择需要的列表项。列表框较下拉列表框更直观,它将所有的列表项罗列在列表框中。但是,下拉列表框较列表框更为便捷、美观,它将所有的列表项隐藏起来,当用户选用其中的列表项时才会显现出来。

JComboBox下拉列表框

下拉列表框是一个条状的显示区,它具有下拉功能,在下拉列表框的右侧存在一个倒三角形的按钮,当用户单击该按钮时,下拉列表框中的项目会以列表形式显示出来。

1
2
3
JComboBox<T>()
JComboBox<T>(Object[] arrayData)
JComboBox<T>(Vector vector)

–利用数组或Vector容器构造JComboBox下拉列表框

1
void addItem(Object object)

–为列表添加项

1
int getItemCount()

–返回列表中的项数

1
Object getSelectedItem()

–返回当前所选项

1
int getSelectedIndex()

–返回列表中与给定项匹配的第一个选项

1
void removeItem(Object object)

–从列表中删除项

1
void setEditable(boolean b)

–设置JComboBox中的字段是否可编辑

JList列表框

列表框组件由JList 对象表示,列表框组件被添加到窗体中后,就会被指定长和宽。如果列表框的大小不足以容纳列表项的个数,那么需要设置列表框具有滚动效果,即把列表框添加到滚动面板。用户在选择列表框中的列表项时,既可以通过单击列表项的方式选择列表项,也可以通过“单击列表项+按住Shift键”的方式连续选择列表项,还可以通过“单击列表项+按住 Ctrl 键”的方式跳跃式选择列表项,并能够在非选择状态和选择状态之间反复切换。

1
2
3
JList<T>()
JList<T>(Object[] arrayData)
JList<T>(Vector vector)

–利用数组或Vector容器构造JList列表框

事件监听器

ActionEvent动作事件

动作事件(ActionEvent)监听器是Swing中常见的事件监听器,很多组件的动作都会使用它监听,如按钮被点击等

为实现动作事件监听功能,首先应创建带ActionListener接口的类,在其内部实现actionPerformed()方法,随后为组件添加监听方法addActionListener()

KeyEvent键盘事件

当向文本框中输入内容时,将发生键盘事件KeyEvent类负责捕获键盘事件,可以通过为组件添加实现了KeyListener接口的监听器类来处理相应的键盘事件。KeyListener接口共有3个抽象方法,分别在发生击键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发。具体如下:

1
2
3
4
5
public interface KeyListener extends EventListener{
public void keyTyped(KeyEvent e) //发生击键事件时被触发
public void keyPressed(KeyEvent e) //按键被按下时被触发
public void keyReleased(KeyEvent e) //按键被释放时被触发
}

KeyEvent方法

1
Object getSource()

–用来获得触发此次事件的组件对象

1
char getKeyChar()

–用来获得与此事件中的键相关联的字符

1
int getKeyCode()

–用来获得与此事件中的键相关联的整数

1
static String getKeyText(int keyCode)

–用来获得描述keyCode的标签,如A、F1和HOME等

1
boolean isActionKey()

–用来查看此事件中的键是否为“动作”键

1
boolean isControlDown()

–用来查看Ctrl键在此次事件中是否被按下,当返回true时表示被按下

1
boolean isAltDown()

–用来查看Alt键在此次事件中是否被按下,当返回true时表示被按下

1
boolean isShiftDown()

–用来查看Shift键在此次事件中是否被按下,当返回true时表示被按下

MouseEvent鼠标事件

所有组件都能发生鼠标事件MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener接口的监听器类来处理相应的鼠标事件。MouseListener接口共有5个抽象方法,分别在光标移入或移出组件鼠标按键被按下或释放发生单击事件时被触发。所谓单击事件,就是按键被按下并释放。需要注意的是,如果按键是在移出组件之后才被释放,则不会触发单击事件。MouseListener接口的具体定义如下:

1
2
3
4
5
6
7
public interface MouseListener extends EventListener {
public void mouseEntered(MouseEvent e); //光标移入组件时被触发
public void mouseExited(MouseEvent e); //光标移出组件时被触发
public void mousePressed(MouseEvent e); //鼠标按键被按下时被触发
public void mouseReleased(MouseEvent e); //鼠标按键被释放时被触发
public void mouseClicked(MouseEvent e); //发生单击事件时被触发
}

MouseEvent方法

1
Object getSource()

–用来获得触发此次事件的组件对象

1
int getButton()

–用来获得代表此次按下、释放或单击的按键的int型值

1
int getClickCount()

–用来获得单击按键的次数