JAVA 第九章
第九章
主要内容
Java Swing概述
基于图形用户界面(GUI)的设计思想,在Java编程中实现人机之间的便捷交互。Swing工具包作为Java框架的一部分,在GUI开发中提供了丰富的资源和支持功能。具体而言,在组件方面包含了按钮、菜单、列表框等;在容器方面则包括窗口、面板等基本元素。
javax.swing包包含了更加强大的类来实现设计GUI的功能。在java.awt和javax.swing包中展示了一个类之间的层级关系的UML类图如图9.1。
在学习GUI编程时,必须要很好的掌握两个概念:容器类和组件类。
- javax.swing包中的JComponent类分别属于java.awt包中Container和Component两个父框架接口的直接实现类型,在Java Swing组件开发中需要重点掌握这些核心组件类型及其应用方法
以下是GUI编程经常提到的基本知识点 。
- 在Java编程语言中,应用领域中的某个问题常常用一个称为"应用成分"(Application Component)的对象来表示。
- 类似地,在Java编程语言中还有一种称为"应用容器"(Application Container)的对象。
- 应用成分能够被添加到应用容器中。
- 应用容器提供了一个名为add()的公共方法来接收并整合这些被注入的应用成分对象。
- 为了管理这些应用成分对象的应用状态信息,在应用层次上提供了两个关键的方法:一种是使用removeAll()方法来移除所有当前注入的应用成分对象;另一种是通过特定参数指定的应用成分对象名称来进行移除操作。
- 需要注意的是,在这种设计模式下,并非所有的应用成分都是独立存在的。实际上,在这种情况下还存在一种特殊的例外情况:即当任何一个应用层次的对象也被视作一个合法的应用成分时,则允许将它注入到其他更高层次的应用容
器对象之中从而实现一种特殊的"嵌套关系"。 - 每当发生新应用成分加入或者旧应用成分退出的情况时,则必须确保所有剩余的应用成分都能够正确呈现出来
如:
JFrame f=new JFrame();
JButton button=new JButton("确定")
f.add(button);
…….
f.remove(button);
窗口
Java提供的JFrame类实例构成一个基础容器系统,一般称为窗口界面.所有其他用户界面元素必须被纳入该基础容器体系中,以便实现与该基础容器以及操作系统的有效交互.
JFrame类是Container接口派生出的一种非直接继承关系实现的子类。为了方便创建窗口界面,在需要构建应用程序界面时可以选择使用JFrame及其相关子类别来生成所需组件对象。
JFrame构造方法:
* JFrame() 创建一个无标题的窗口。
* JFrame(String s) 创建标题为s的窗口。
常用方法:
1)public void setBounds(int a,int b,int width,int height 设置窗口的初始位置是(a,b),//即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。
2)public void setSize(int width,int height) //设置窗口的大小。
3)public void setLocation(int x,int y) //设置窗口的位置,默认位置是(0,0)。
4)public void setVisible(boolean b) //设置窗口是否可见,窗口默认是不可见的。
5)public void setResizable(boolean b) //设置窗口是否可调整大小,默认可调整大小。
6)public void dispose() //撤消当前窗口,并释放当前窗口所使用的资源。
7)public void setExtendedState(int state) //设置窗口的扩展状态.
8)public void setDefaultCloseOperation(int operation) //该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。如:EXIT_ON_CLOSE
9)public void setLayout(LayoutManager mgr)// 设置此容器的布局管理器。
10)public Component add(Component comp) //将指定组件追加到此容器的尾部。
11)public void setMenuBar(MenuBar mb) //将此 frame 的菜单栏设置为指定的菜单栏。
12)public void validate() //使用 validate 方法会使容器再次布置其子组件。在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。
菜单条
- JMenubar作为JComponent的子类负责实现创建菜单条的功能。在Java Swing框架中,JFrame组件提供了一个名为setJMenuBar的方法,该函数用于将一个指定的JMenuBar对象放置在窗口顶端位置。
- 菜单条对象的构造器定义为无参数版本以及带有参数版本: JMenuBar(); 和 JMenuBar Mbar=new JMenuBar();
菜单
- JComponent类的一个子类是JMenu类, 用于创建菜单系统.
- 菜单系统JMenu具有的构造函数包括:
- 空构造函数
- 带有一个字符串参数的构造函数
- 需要时 instantiates一个新实例
- 常见功能包括:
- 获取当前菜单系统的标题
- 显示所有可用选项列表
- 菜单系统JMenu具有的构造函数包括:
public void add(JMenuItem item) 向菜单增加由参数item指定的菜单项
public JMenuItem getItem(int n) 得到指定索引处的菜单选项。
public int getItemCount() 得到菜单选项的数目。
菜单项
* JComponent类的子类JMenuItem负责创建菜
JMenuItem类的主要方法有以下几种:
JMenuItem(String s) 构造有标题的菜单项。
JMenuItem(String text, Icon icon) 构造有标题和图标的菜单项
public void setAccelerator(KeyStroke keyStroke)为菜单项设置快捷键
常用组件与布局
可以使用JComponent的子类JTextField创建各种组件。
利用组件可以完成应用程序与用户的交互及事件处理等。
另外一种方式是在命令行窗口实时解码组件以识别其属性及常用方法
除了查看官方文档资料外,请确保已安装 JDK 6 的环境并运行以下命令:C:\>javap javax.swing.JTextField。
常用组件
* 文本框:
由JComponent的子类JTextField创建文本框。
构造函数:JTextField( ) ; JTextField(int columns) ;
常用方法:
public String getText();
public void setText(String t);
文本区:
- 基于Java Swing组件库中的一种子类实现的文本区域组件。
- 初始化函数包括以下几种形式:
- 一种是默认的新对象初始化
- 另一种是自定义大小参数指定
- 常见操作包括但不限于:
- 文本输入与输出
- 行编辑功能
- 格式化显示选项设置
- 初始化函数包括以下几种形式:
public String getText();
public void setText(String t);
按钮:
- 基于JComponent的子类JButton类用于生成按钮。
- 构造方法包括:new JButton(); new JButton(String text);
- 常见操作
public void addActionListener(ActionListener l);
标签:
- 使用JLabel类(作为JComponent的子类)来生成标签。
- 支持以下几种构造函数:new JLabel();new JLabel(text);new JLabel(image).
- 常见操作:
public String getText();
public void setText(String t);
选择框:
用于实现选择框功能的是JComponent的子类JCheckBox类。
构造函数: JCheckBox类有两个构造函数;分别接受无参数和一个文本参数。
常见操作方法包括初始化设置、选择项管理以及状态反馈等。
public void addItemListener(ItemListener l)
public void addActionListener(ActionListener l)
ItemListener接口中:Object getItemSelectable()相当于getSource();
public int getStateChange();
若被选中SELECTED/DESEELCTED
单选按钮:
- 基于JComponent的子类JRadioButton类用于创建单项选择框。
- 构造函数如下:
- JRadioButton()
- JRadioButton(String text)
- 常用方法包括:
- getLabel(): String
- setText(text: String)
- isSelected(): Boolean
- setSelected(selected: Boolean)
- 构造函数如下:
public void addItemListener(ItemListener l)
下拉列表:
- JComboBox类作为JComponent的子类被用于创建下拉列表。
- 其构造函数包括两个版本:一个是无参版本(new JComboBox()),另一个是有参数版本(new JComboBox(items))。
- 常用方法:
- 获取当前选择项(getSelectedItem())
- 清空列表(clear())
- 获取可用选项(getOptionals())
public void addItemListener(ItemListener l)
public Object getSelectedItem();
public int getSelectedIndex()
密码框:
- 基于JComponent的subclass JPasswordField生成密码框.
- 构造函数如下:
- JPasswordField()(无参数)
- JPasswordField(int columns)(带一个整数参数)
- 常用方法:
- 构造函数如下:
public String getText();
public void setText(String t);
public void setEchoChar(char c)使用该方法重新设置回显字符.
public char[] getPassword()方法可以返回实际的密码
在将组件放入容器时, 为了便于控制组件在容器内的位置, 必须掌握布局设计的基础知识.
我们将逐一阐述java.awt包中FlowLayout、BorderLayout、CardLayout、GridLayout布局类以及java.swing.border包中的BorderLayout布局类
容器可以使用方法:
setLayout(布局对象);
来设置自己的布局,控制组件在容器中的位置
处理事件
- 除了掌握组件的基本属性与功能之外, 一个关键点在于学会如何应对发生在组件上的各种界面事件。
- 当用户在输入框内输入文本并按回车键、点击按钮或者从下拉列表中选择一项时, 都会触发相应的界面事件。
- 程序通常会根据不同的事件做出相应的响应, 从而完成特定任务。
- 例如说, 用户点击标有"确定"或"取消"的按钮时, 程序可能会采取不同的处理方式。
使用MVC结构
- 模型架构模式(Model-View-Controller)体系结构简称为MVC。
- MVC被设计为通过会话形式提供方便的图形用户界面支持。
- MVC被描述为一种构建软件或组件的理想方法:
- 数据存储层负责管理应用中的各种数据对象。
- 数据呈现层将数据以用户友好的方式展示出来。
- 交互控制层负责处理用户的交互操作,并根据用户的指令引发相应的响应,在此过程中与数据存储层和数据呈现层进行必要的交互。
对话框
- JDialog类与JFrame类均继承自Window类,并在其实例中扮演底层容器角色。
- 由JDialog类所创建的对话框必须建立在某个主窗口的基础之上。
- 对话框主要分为两种类型:有模式与无模式。
- 有模式的对话框:当其处于激活状态时,则仅限程序处理内部事件,并可能导致其他线程被阻塞。
- 无模式对话框:当其处于激活状态时,则允许程序在其他窗口之间切换而不影响其他线程执行。
发布GUI程序
通过jar.exe程序可以将多个文件打包成一个JAR格式的可执行文件以方便发布。
生成一个JAR文件的具体步骤如下:
首先创建一个名为Moon.mf的清单文件(扩展名为.mf),其中包含需要打包的应用程序的所有字节码文件路径。
接下来在命令行界面中执行 jar cfm Tom.jar Moon.mf *.class 命令即可完成打包操作。
如果目录test下的字节码文件正好包含了应用程序所需的全部代码,则可以直接运行 jar cfm Tom.jar Moon.mf *.class 命令并将其打包到指定路径上。
用户可以在任意安装Java运行环境的计算机上双击Tom.jar 文件直接启动并运行该Java应用程序。
重点和难点
重点:Swing包中的各种组件,各种布局和事件处理器的应用
难点:各种事件处理器的使用
总结
掌握组件类和容器类的概念。
Java把Component类的子类或间接子类创建的对象称为一个组件
Java把Container的子类或间接子类创建的对象称为一个容器.
可以向容器添加组件 。
*Container类支持有一个名为add()的方法,该容器能够使用该方法来加入组件。
容器将 removeAll() 方法执行会删除整个容器中的组件集合;而通过 remove 函数来处理,则能删除根据参数 c 筛选出的具体组件。
意识到一个组件的概念后,则可理解为一个功能模块能够被包含在另一个功能模块内部从而使得一个容器能够被包含在另一个容器内部实现嵌入效果
在添加/移除组件时
掌握各种组件的特点和使用方法。
//文本框:由JComponent的子类JTextField创建文本框。
//构造函数:
JTextField( ) ;
JTextField(int columns) ;
//常用方法:
public String getText();
public void setText(String t);
//文本区:由JComponent的子类JTexArea创建文本区。
//构造函数:
JTextArea() ;
JTextArea(int rows, int columns)
//常用方法:
public String getText();
public void setText(String t);
//按钮:由JComponent的子类JButton类用来创建按钮。
//构造函数:
JButton() ;
JButton(String text) ;
//常用方法:
public void addActionListener(ActionListener l);
//标签:由JComponent的子类JLabel类用来创建标签。
//构造函数:
JLabel() ;
JLabel(String text) ;
JLabel(Icon image) ;
//常用方法:
public String getText();
public void setText(String t);
//选择框:由JComponent的子类JCheckBox类用来创建选择框
//构造函数:
JCheckBox() ;
JCheckBox(String text) ;
//常用方法:
public void addItemListener(ItemListener l)
public void addActionListener(ActionListener l)
//单选按钮:由JComponent的子类JRadioButton类用来创建单项选择框。
//构造函数:
JRadioButton() ;
JRadioButton(String text) ;
//常用方法:
public void addItemListener(ItemListener l)
//下拉列表:由JComponent的子类JComboBox类用来创建下拉列表。
//构造函数:
JComboBox() ;
JComboBox(Object[] items)
//常用方法:
public void addItemListener(ItemListener l)
public Object getSelectedItem();
public int getSelectedIndex()
//密码框:由JComponent的子类JPasswordField创建密码框.
//构造函数:
JPasswordField() ;
JPasswordField(int columns)
//常用方法:
public String getText();
public void setText(String t);
public void setEchoChar(char c) //使用该方法重新设置回显字符.
public char[] getPassword() //方法可以返回实际的密码
本章的核心内容在于掌握各组件之间的交互机制,在Java语言中这一机制主要体现为基于事件源、监视器以及处理事件接口的方式进行交互。
1.
事件源 : 能够产生事件的对象 都可以成为事件源 .
2.
监视器 : 事件源通过调用相应的方法将某个对象注册为自己的监视器。
此方法的作用是用于处理文本框中的相关事件。
在Java语言中,默认情况下所有监视器都是通过接口实现的。
当事件源注册了监视器后,
相应地执行的操作会导致相应事件的发生并触发通知,
而这些信息会被用来让监视者做出相应的响应或处理。
3.
处理事件的接口:
该设备负责接收并处理来自传感器的信号。
作为一个对象体,在接收来自传感器的信号并执行相应的数据处理操作的同时也会触发内部的状态更新机制。
Java规定:为了实现设备能够正常运行并响应环境变化的需求;相关系统必须配置相应的监控逻辑;一旦检测到特定环境变化;系统将自动执行预设的操作流程。
