|
在连载一中,我简单的介绍了一下Java的基础知识,从这里起,我就开始讲图形用户界面(GUI)的Java程序,就像大家所熟悉的windows操作系统一样,比起控制台那个黑黑的窗口,实在要美观多啦!接下来,我们就要学习更多新知识了。
图形用户界面
相信大家对windows界面已经非常熟悉了吧!像菜单,按钮,文本框,组合框,列表框,单选和复选框等等,大家都已经非常熟悉了。那么从现在起就开始学习在Java中编出这些熟悉的界面元素吧!
首先,说一下Java中的一些名词解释:上面提到的界面元素,我们在Java中叫作组件(学VB或其他可视化编程的朋友习惯叫控件),而使用这些组件之前就需要用import关键字来导入相应的包(相关类的结合)。通常情况下,我们都是用AWT和Swing包。由于这两个包中的内容在很大一部分程度上是相似的,所以很多朋友不明白,为什么有了AWT还用Swing?难道Swing是多余的吗?其实很多朋友误解了,Swing包是对AWT的扩充,AWT包中的组件在不同的操作系统上所表示的形式并不一样,这就导致很多程序员为了编写一个跨平台的程序而对代码作许多相关测试,非常不方便!而Swing的出现就是为了解决这一问题,我学习和使用的就是Swing包中的组件。下面就给出Swing组件的类层次结构(组件名都冠以J开头):
JComponent ┏━━━━━┳━━━━━┳━━━━━╋━━━━━┳━━━━┳━━━━━┓ JButton JComboBox JLabel JToggleButton JList JMenuBar JMenuItem ┃ ┃ JRadioButton JCheckBoxMenuItem ┃ ┃ JCheckBox JRadioButtonMenuItem
下面我们建立一个简单的应用程序,用于接收客户数据的图形用户界面:
import javax.swing.*; //导入Swing包,否则无法使用下面组件
public class AcceptData
{
static JFrame fraObj; //定义窗口的框架
static JPanel panelObj; //定义面板,用于放置组件
//定义标签,用于提示客户输入信息
JLabel lblCustName;
JLabel lblCustCellNo;
JLabel lblCustCountry;
JLabel lblCustAge;
//定义文本编辑框,用于接收客户输入
JTextField txtCustName;
JTextField txtCustCellNo;
JTextField txtCustAge;
//定义组合框,提供可选择的选项
JComboBox cboCustCountry;
public AcceptData() //通过构造方法初始化组件
{
fraObj=new JFrame("客户数据处理窗口");
panelObj=new JPanel();
fraObj.getContentPane().add(panelObj); // 把面板加入到框架中
fraObj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口“关闭”按钮事件,否则无法正常退出程序
在本次教程中,偶讲一下在JDK组件布局管理器的使用方法。在JAVA中一共有7种布局方式:流式布局,网格布局,边界布局,卡面布局,网格包布局,盒式布局,自定义布局,它们是AWT包提供的。
布局管理器
·流式布局(FlowLayout)是JAVA小应用程序默认的布局管理方式,它是按组件加入容器的次序,按行一个按一个放置组件,当组件达到Applet右边界时,它就在下一行开始放置组件。在缺省状态下,FlowLayout管理器使组件对准每一行的中心。
·网络布局(GridLayout)是最简单的布局管理器,它把容器分成所需要的矩形网格,然后把你创建的组件放入每个格式,从左到右,自上向下的放置。
·边界布局(BorderLayout)管理器让你按东,南,西,北,中的方向来安置组件。
·卡片布局(CardLayout)管理器是创建如卡面盒之类的布局盒,然后从一种布局翻动到另一种布局。它形象的模拟了现实生活某些实例,如一个盒子里放置了许多东西,假设盒子只有一个口,那么你永远只能看到最上面的物件,只有当你拿走上面的物件后,下面的物件才会显示出来。就这样一层一层往下翻动,如此循环不休,一层一层的往下翻。
·盒式布局(BoxLayout)管理器跟卡面布局有些相似,不过它允许你在容器中水平或垂直的、并排的安排多个组件。
·网格包型(GridBagLayout)布局管理器是AWT提供的最灵活,最复杂,最常用的布局管理器之一,类似于网格布局,但它允许你把组件放在网格中任何行或列,也允许你的组件跨多行或多列。它是通过设置GridBagConstraints对象中的变量来约束组件布局的。
·自定义布局(null)管理器是通过组件本身的setBounds()方法来设置组件在容器中的位置,是最常用的布局管理器之一,相对于网格包型而言,还是非常简单的,只不过需要计算每个组件大小以及容器位置。
对于上面7种布局,偶不可能一一举例,那就以最常用的下面两种布局方式来跟大家介绍一下布局管理器,首先是网格包型。
网格包型布局方式,就是通过设置GridBagConstraints对象中的一些参数来达到有序的安排组件的效果,GridBagConstraints有:gridwidth,gridheight,anchor,fill,gridx,gridy,weightx,weighty等属性,通过给这些赋不同的值来改变组件排放位置。
gridwidth,gridheight指出组件的大小等它显示区域的大小,缺省值为1,可以修改这两个值来扩大组件的显示区域。但要注意的是,如果显示区域区域大小增加了,组件本身的大小是不会增加的。
anchor属性是显示区域内确定放置组件位置。其有效值为东,南,西,北,中,东南,东北,西南,西北,默认为中。
fill表示当组件小于它的显示区域时,设置它的填充方式。缺省为NONE(空),可以选择HORIZONTAL(水平)、VERTICAL(垂直)和BOTH。
这回来讲一下JAVA中组件的事件处理,个人认为从本章起到后面的内容都是比较难的,当初我学的时候也有很多不懂的地方,后来通过练习,慢慢掌握的,所以大家一定要多看别人的例程,自己多动手练习一下,应该是没有问题的!
事件处理
在JAVA中,一个事件包括事件对象,事件源和事件处理程序。在JAVA中要实现某个组件事件处理,就必需先添加监听程序,也就是说,监听程序就是监视组件是否产生了事件,只有添加它才能让程序知道响应事件处理,否则程序是无法知道组件在何时产生了事件的,也就无法响应对事件的处理了。当你创建监听程序而使用的是接口的话,那么就必须重写接口中声明的所有方法(因为全为抽象方法,所以全部需要重新实现),这样子是比较麻烦的,事实上JAVA有为大部分多方法接口提供了适配器。使用适配器可以让你只写需要的监听程序就行了。
下面给出JAVA中最主要的基本常用适配器类和接口列表:
事件种类 | 接口 | 适配器 | 方法 | 窗口 | WindowListener | WindowAdapter | void windowClosing (windowEvent e) | void windowOpened (windowEvent e) | void windowActiveed (windowEvent e) | void windowDeactivated (windowEvent e) | void windowClosed (windowEvent e) | void windowIconified (windowEvent e) | void windowDeiconified (windowEvent e) | 动作 | ActionListener |
| void actionPerformed (windowEvent e) | 列表 | ItemListener |
| void itemStateChanged (windowEvent e) | 鼠标移动 | MouseMotionListener | MouseMotionAdapter | void mouseDragged (windowEvent e) | void mouseMoved (windowEvent e) | 鼠标按钮 | MouseListener | MouseAdapter | void mousePressed (MouseEvent e) | void mouseReleased (MouseEvent e) | void mouseEntered (MouseEvent e) | void mouseExited (MouseEvent e) | void mouseClicked (MouseEvent e) | 按键 | KeyListener | KeyAdapter | void KeyPressed (KeyEvent e) | void KeyReleased (KeyEvent e) | void KeyTyped (KeyEvent e) | 聚焦 | FocusListener |
| void focusGained (FocusEvent e) | void focusLost (FocusEvent e) | 组件 | ComponentListener | ComponentAdapter | void componentMoved (ComponentEvent e) | void componentResized (ComponentEvent e) | void componentHidden (ComponentEvent e) | void componentShown (ComponentEvent e) |
|