Swing程序设计
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 | JFrame() |
–创建一个初始不可见,有或无标题的窗体。
1 | Container getContentPane() |
–得到JFrame窗体对应的Container容器。
窗体设置
1 | setBounds(int x, int y, 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 | static int showOptionDialog(Component parentComponent, |
其中参数说明:
- 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 | static int showConfirmDialog(Component parentComponent, |
输入框
输入框已经封装好了一套外观样式,弹出后要求用户在文本框中输入文本,用户完成输入操作后,输入框可以返回用户输入的结果。
1 | static String showInputDialog(Component parentComponent, |
通知框
通知框是最简单的一类对话框,仅弹出提示,而不会返回任何值。
1 | static void showMessageDialog(Component parentComponent, |
布局管理
通常,组件放置在容器中, 布局管理器决定容器中的组件具体放置的位置和大小。
按钮、文本域和其他的用户界面元素都继承于Component 类, 组件可以放置在面板这样的容器中。由于 Container 类继承于 Component 类,所以容器也可以放置在另一个容器中。
每个容器都有一个默认的布局管理器,但可以重新进行设置。可以往容器中添加组件。容器的*add()*方法将把组件和放置的方位传递给布局管理器。
容器
1 | void setLayOut(LayoutManager m) |
–为容器设置布局管理器。
1 | Component add(Component c) |
–将组件添加到容器中,并返回组件的引用。
constraints为布局管理器理解的标识符。
1 | void remove(Component c) |
–删除容器中的组件
绝对布局
绝对布局也叫null布局,其特点是硬性指定组件在容器中的位置和大小,组件的位置通过绝对坐标的方式来指定。使用绝对布局首先要使用*Container.setLayout(null)方法取消容器的布局管理器,然后再使用Component.setBounds(int x, int y, int width, int height)*方法设置每个组件在容器中的位置和大小。
流布局
流布局(FlowLayout)管理器是 Swing中最基本的布局管理器。使用流布局管理器摆放组件时,组件被从左到右摆放。当组 件占据了当前行的所有空间时,溢出的组件会被移动到当前行的 两个下一行。
1 | FlowLayout() |
–构造一个新的 FlowLayout 对象。
align参数指LEFT, CENTER, RIGHT
hgap参数指以像素为单位的水平间距
vgap参数指以像素为单位的垂直间距
边框布局
边框布局管理器(border layout manager) 是每个JFrame的内容窗格的默认布局管理器。
流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。可以选择把组件放在内容窗格的中部、 北部、南部、 东部或者西部。
边框布局先放置边缘组件,剩余的可用空间由中间组件占据。当容器被缩放时,边缘组件的尺寸不会改变,而中部组件的大小会发生变化。在添加组件时可以指定 BorderLayout 类中的 CENTER、 NORTH、SOUTH、EAST和 WEST 常量。并非需要占用所有的位置,如果没有提供任何值,系统默认为 CENTER。
与流布局不同,边框布局会扩展所有组件的尺寸以便填满可用空间(流布局将维持每个组件的最佳尺寸),此时直接将按钮添加到容器中会出现问题。解决这个问题的常见方法是使用另外一个面板(panel)
1 | BorderLayout() |
–构造一个新的 BorderLayout 对象。
hgap参数指以像素为单位的水平间距
vgap参数指以像素为单位的垂直间距
网格布局
网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的。
1 | GridLayout(int rows, int columns) |
–构造一个新的 GridLayout 对象。rows 或者 columns 可以为零, 但不能同时为零,指定的每行或每列的组件数量可以任意的。
rows指网格的行数
columns指网格的列数
hgap参数指以像素为单位的水平间距
vgap参数指以像素为单位的垂直间距
面板
在Swing程序设计中,面板是一个容器,被用于容纳其他组件,但面板必须被添加在其他容器中。
面板JPanel
……..
滚动面板JScrollPanel
在Swing中,文本区没有滚动条。如果需要滚动条,可以将文本区插人到滚动面板(JScrollPanel) 中。
JScrollPanel滚动面板不能使用布局管理器,同时只能容纳一个组件。如果需要在一个JScrollPanel滚动面板中添加多个组件,那么可以先将多个组件添加到JPanel面板。
例:
1 | JTextArea textArea = new JTextArea(8, 40); |
现在滚动窗格管理文本区的视图。如果文本超出了文本区可以显示的范围, 滚动条就会自动地出现, 并且在删除部分文本后,当文本能够显示在文本区范围内时, 滚动条会再次自动地消失。滚动是由滚动窗格内部处理的, 编写程序时无需处理滚动事件。这是一种为任意组件添加滚动功能的通用机制, 而不是文本区特有的。也就是说, 要想为组件添加滚动条, 只需将它们放人一个滚动窗格中即可。
文本输入
文本域JTextField
文本域(JTextField) 和文本区(JTextArea) 组件用于获取文本输入,文本域只能接收单行文本的输入,而文本区能够接收多行文本的输入。JPassword也只能接收单行文本的输入,但不会将输入的内容显示出来。
这三个类都继承于JTextComponent类(抽象类)。
JTextComponent方法
1 | String getText() |
–获取或设置文本组件中的文本。
1 | boolean isEditable() |
–获取或设置editable特性, 这个特性决定了用户是否可以编辑文本组件中的内容
JTextField方法
1 | JTextField(int cols) |
–构造一个给定列数的空JTextField对象。
1 | JTextField(String text, int cols) |
–构造一个给定列数、给定初始字符串的JTextField对象。
1 | int getColumns() |
–获取或设置文本域使用的列数。
1 | void revalidate() |
–重新计算组件的位置和大小
使用 *setColumns()方法改变了一个文本域的大小之后, 需要调用包含这个文本框的容器的revalidate()方法。revalidate()方法会重新计算容器内所有组件的大小,并且对它们重新进行布局。调用revalidate()*方法以后, 布局管理器会重新设置容器的大小, 然后就可以看到改变尺寸后的文本域了。
1 | void validate() |
–重新计算组件的位置和大小(对JFrame组件)(JFrame没有扩展JComponent,无法使用revalidate)
1 | Font getFont() |
–设置组件的字体。
标签JLabel
标签是容纳文本的组件,它们没有任何的修饰(例如没有边缘),也不能响应用户输入。可以利用标签标识组件。
JLabel 的构造器允许指定初始文本和图标, 也可以选择内容的排列方式。可以用 SwingConstants 接口中的常量来指定排列方式。在这个接口中定义了几个很有用的常量, 如 LEFT、RIGHT、CENTER、 NORTH、 EAST 等。
可以在按钮、标签和菜单项上使用无格式文本或 HTML 文本。
JLabel方法
1 | Jlabel(String text) |
构造一个标签。
text为参数中的文本,icon为标签中的图标,align为一个SwingConstants的常量LEFT(默认)、CENTER、RIGHT。
1 | String getText() |
获取或设置标签的文本。
1 | Icon getIcon() |
获取或设置标签的图标。
密码域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 | JTextArea() |
构造一个新的文本区对象。
1 | void setColumns(int cols) |
设置文本区应该使用的首选列数、行数。
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 | void setIcon(Icon icon) |
–设置图标与提示文字
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 | ButtonGroup() |
–构造一个ButtonGroup对象并向其中添加button
复选框JCheckBox
复选框组件由JCheckBox对象表示。与单选按钮不同的是,窗体中的复选框可以被选中多个,是因为每一个复选框都提供“被选中”和“不被选中”两种状态。
1 | JCheckBox(String text, boolean checked) |
–构造一个JCheckBox对象
列表
Swing 中提供两种列表组件,分别为下拉列表框 (JComboBox)与列表框 (JList)。下拉列表框与列表框都是带有一系列列表项的组件,用户可以从中选择需要的列表项。列表框较下拉列表框更直观,它将所有的列表项罗列在列表框中。但是,下拉列表框较列表框更为便捷、美观,它将所有的列表项隐藏起来,当用户选用其中的列表项时才会显现出来。
JComboBox下拉列表框
下拉列表框是一个条状的显示区,它具有下拉功能,在下拉列表框的右侧存在一个倒三角形的按钮,当用户单击该按钮时,下拉列表框中的项目会以列表形式显示出来。
1 | JComboBox<T>() |
–利用数组或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 | JList<T>() |
–利用数组或Vector容器构造JList列表框
事件监听器
ActionEvent动作事件
动作事件(ActionEvent)监听器是Swing中常见的事件监听器,很多组件的动作都会使用它监听,如按钮被点击等
为实现动作事件监听功能,首先应创建带ActionListener接口的类,在其内部实现actionPerformed()方法,随后为组件添加监听方法addActionListener()
KeyEvent键盘事件
当向文本框中输入内容时,将发生键盘事件。KeyEvent类负责捕获键盘事件,可以通过为组件添加实现了KeyListener接口的监听器类来处理相应的键盘事件。KeyListener接口共有3个抽象方法,分别在发生击键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发。具体如下:
1 | public interface KeyListener extends EventListener{ |
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 | public interface MouseListener extends EventListener { |
MouseEvent方法
1 | Object getSource() |
–用来获得触发此次事件的组件对象
1 | int getButton() |
–用来获得代表此次按下、释放或单击的按键的int型值
1 | int getClickCount() |
–用来获得单击按键的次数