Java程序开发学习之组件及事件处理

(学习参考书:Java2实用教程第5版)

一、GUI编程

容器类(Container)和组件类(Component)。javax.swing包中JComponent类是java.awt包中Container类的一个直接子类,java.awt包中Component类的一个间接子类。GUI编程的基本知识点:

  • Java把Component类的子类或间接子类创建的对象称为一个组件
  • Java把Container的子类或间接子类创建的对象称为一个容器
  • 可以向容器添加组件。Container类提供了一个public方法add(),一个容器可以调用这个方法将组件添加到该容器中。
  • 容器调用removeAll()方法可以移除容器中的全部组件,调用remove (Component c)方法可以移除参数c指定的组件。
  • 容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。
  • 每当把容器添加新的组件或移除组件时,应当让容器调用validate()方法,以保证容器中的组件能正确显示出来。

二、窗口

基于GUI的应用程序能够提供一个能和操作系统直接交互的容器,该容器可以被直接显示,绘制在操作系统所控制的平台上(显示器),这样的容器被称为GUI设计中的底层容器。Java提供的JFrame类创建的对象就是一个底层容器,俗称窗口。(JDialog类创建的对象也是一个底层容器,俗称对话框。)当需要一个窗口时,可以使用JFrame或其子类创建一个对象。
(1)JFrame常用方法:

	JFrame()创建一个无标题的窗口
	
	JFrame(String s)创建标题为s的窗口
	
	public void setBounds(int a,int b,int width,int height)设置窗口的初始位置为(a,b),即距屏幕左边a个像素,距屏幕上方b个像素,窗口的宽是width,高是height
	
	public void setSize(int width,int height)设置窗口的大小宽是width,高是height
	
	public void setLocation(int x,int y)设置窗口的位置,默认位置是(00public void setVisible(boolean b)设置窗口是否可见,窗口默认不可见
	
	public void setResizable(boolean b)设置窗口是否可调整大小,默认可调整大小
	
	public void dispose()撤销当前窗口,并释放当前窗口所使用的资源
	
	public void setExtendedState(int state)设置窗口的扩展状态,其中参数state取JFrame类中的·	下列类常量:
	MAXIMIZED_HORIZ 水平方向最大化
	MAXIMIZED_VERT 垂直方法最大化
	MAXIMIZED_BOTH 水平垂直方向都最大化
	
	public void setDefaultCloseOperation(int operation)设置单击窗体右上角关闭图标后,程序会做出怎样的处理。其中参数operation取JFrame类中int static常量:
	DO_NOTHING_ON_CLOSE 什么也不做
	HIDE_ON_CLOSE 隐藏当前窗口
	DISPOSE_ON_CLOSE 隐藏当前窗口,并释放窗体占有的其他资源
	EXIT_ON_CLOSE 结束窗口所在的应用程序

(2)菜单条、菜单、菜单项
这三者是窗口常用的组件,菜单放在菜单条里,菜单项放在菜单里

  1. 菜单条:JComponent类的子类JMenubar负责创建菜单条,即JMenubar创建的一个对象就是一个菜单条。JFrame有一个将菜单条放置到菜单的方法:
    setJMenuBar(JMenuBar bar) 该方法将菜单条添加到窗口的最顶端,只能向窗口添加一个菜单条
  2. 菜单:JComponent类的子类JMenu负责创建菜单,即JMenu创建的一个对象就是一个菜单
  3. 菜单项:JComponent类的子类JMenuItem负责创建菜单项,即JMenuItem创建的一个对象就是一个菜单项
  4. 嵌入子菜单:JMenu是JMeunItem的子类,因此菜单本身也是一个菜单项,当把一个菜单看作菜单项添加到某个菜单时,称被添加的菜单为子菜单
  5. 菜单上的图标:为了使菜单项有一个图标,可以使用图标类Icon声明一个图标,然后使用其子类ImageIcon类创建一个图标。然后菜单项调用setIcon(Icon
    icon)方法将图标设置为参数icon

三、常用组件与布局

(1)常用组件:都是JComponent的子类

JTextField 文本框,允许用户在文本框输入单行文本

JTextArea 文本区,允许用户在文本区输入多行文本

JButton 按钮,允许用户单击按钮

JLabel 标签,标签为用户提供提示信息

JCheckBox 复选框,为用户提供多项选择,并提供两种状态,一种是选中,一种是未选中,用户通过单击该组件切换状态

JRadioButton 单选按钮,为用户提供单项选择

JComboBox 下拉列表,为用户提供可单项选择的列表

JPasswordField 密码框,允许用户在框内输入单行密码,密码的默认回显字符是*。可以使用setEchoChar(char c)重新设置回显字符,调用char[] getPassword()方法返回用户在密码框中输入的密码。

(2)常用容器:JComponent专门提供了一些经常用来添加组件的容器,相对于JFrame底层容器,这些容器常被称为中间容器。中间容器必须被添加到底层容器才能发挥作用。

JPanel 面板,创建有个面板后,再向其中添加组件,然后把这个面板添加到其他容器中。JPanel面板的默认布局是FlowLayout布局

JTabbedPane 选项卡窗口,当用户向其中添加一个组件时,选项卡窗口自动为该组件指定一个对应的选项卡,即让一个选项卡对应一个组件。各个选项卡对应 的组件层叠式放入该容器中,当用户单击选项卡时,容器会显示选项卡对应的组件。选项卡默认在该容器的顶部,从左向右依次排列。使用add(String text,Component c);方法将组件c添加到选项卡容器中去,并且对应文本提示是text。

JScrollPane 滚动窗格,只可以添加一个组件,可以把组件放到一个滚动窗格中,然后通过滚动条来观看该组件比如JTextArea不自带滚动条,因此把文本区放到滚动窗口中:JScrollPane scroll = new JScrollPane(JTextArea);

JSplitPane 拆分窗格,是被分成两部分的容器。具有水平拆分和垂直拆分。水平拆分窗口就是左右各一组件,中间用可以水平移动的拆分线隔。垂直拆分同理。
两个常用构造方法:
JSplitPane(int a,Component b,Component c);参数a取该类的静态常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,决定是水平还是垂直
JSplitPane(int a,boolean b,Component c,Component d);参数a同上决定方向,参数b决定当拆分线移动时,组件是否连续变化(true是连续)

JLayeredPane 分层窗格,如果添加到容器的组件经常需要处理重叠问题,就可以考虑将组件添加到分层窗格中。分层窗格分为5层,使用add(Jcomponentcom,int layer)添加组件com,并指定com所在的层。layer的取值是该类中的类常量:DEFAULT_LAYER(最底层),PALETTE_LAYER, MODAL_LAYER,POPUP_LAYER,DRAG_LAYER(最上层)。
如果分层窗口添加了多个组件,当用户用鼠标移动一组件时,可以把该组件放到最上层。添加到同一层的组件,如果发生重叠,后添加的会遮挡先添加的组件。分层窗格调用public void setLayer(Component c,int layer)可以重新设置组件c所在的层,调用public int getLayer(Component c)可以获取c所在的层数。

(3)常用布局:布局可以控制组件在容器中的位置。设置布局的方法:setLayout(布局对象);

FlowLayout 常用构造方法FlowLayout();可以创建一个居中对齐的布局对象使用add方法将组件顺序添加到容器中,组件按照先后顺序从左到右排列,一行排满后就转到下一行继续从左到右排列。组件的大小默认为最佳大小,如需调整需调用public void setPreferredSize(new Dimension(int x,int y))。调用setAlignment(int align)方法可以重新设置布局的对齐方式,其中参数align取值FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RUGHT。

BorderLayout 使用这种布局的容器将空间简单分为东西南北中5个区域,每一个添加的组件应该指明添加到哪个区域中。区域由静态常量表示:CENTER、NORTH、SOUTH、WEST、EAST例:将组件b添加到使用该布局的容器con中:con.add(b,BorderLayout.CENTER);

CardLayout  使用该布局的容器可以容纳多个组件,这些组件被层叠放入容器中,最先加入的容器是第一张(最上面),依次向下排列。该布局的特点是:同一时刻容器只能从这些组件中选一个出来显示。假设有一个容器con,使用步骤如下:
(1)创建CardLayout对象作为布局:CardLayout card = new CardLayout();
(2)为容器设置布局:con.setLayout(card)
(3)容器调用add(String s,Component b)将组件b加入容器,给出代号s(不是组件的名字)
(4)用代号显示组件:card.show(con,s);也可按顺序显示

GridLayout  使用较多的布局编辑器,把容器划分为若干行乘若干行的网格区域。组件位于每一个小格中,调用方法add(Component c)将组件c加入容器

null 空布局可以准确定位组件在容器内的大小和位置。setBounds(int a,int b,int width,int height)方法是所有组件都拥有的一个方法。使用方法:
(1)设置容器p为空布局:p.setLayout(null)
(2)添加组件:p.add(Component c)
(3)设置大小和位置:c.setBounds(int a,int b,int width,int height)

BoxLayout 盒式容器,可以利用容器的嵌套,将某个容器嵌入几个盒式容器,达到布局目的。使用静态方法createHorizontaBox()获得一个行型盒式容器,createVerticalBox获得一个列型盒式容器。使用水平支撑和垂直支撑控制布局容器和组件之间的距离。createHorizontalStrut(int width)得到一个不可见的水平支撑,宽度为width;createVerticalStrut(int height)得到一个不可见的垂直支撑,高度为height。

四、处理事件

程序对用户在界面上进行的操作作出反应,来实现特定的任务叫处理事件。
(1)事件处理模式
事件源:能够产生事件的对象都可以称为事件源,如文本框、按钮、下拉式列表等。事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。
监视器:需要一个对象对事件源进行监视,以便对发生的事件做出处理。事件源通过调用相应的方法将某个对象注册为自己的监视器。用户相应的操作就会导致相应事件的发生,并通知监视器做出相应的处理。
处理事件的接口:监视器是一个对象,为了处理事件源发生的事件,监视器会自动调用一个方法。Java规定:为了让监视器能够对事件源发生的事件进行处理,创建该监视器的类必须实现相应的接口,监视器在事件发生时就调用类重写的接口方法。

(2)ActionEvent事件
ActionEvent事件源:文本框、按钮、菜单项、密码框和单选按钮都可以触发ActionEvent事件,即都可以成为ActionEvent事件的事件源。
注册监视器:Java规定能触发ActionEvent事件的组件使用方法addAction Listener(ActionListener listen)(该参数的类型是接口)将实现ActionListener接口的类的实例注册为事件源的监视器。
ActionListener接口:事件源触发ActionEvent事件后,监视器调用action Performed(ActionEvent e)对发生的事件做出处理。
ActionEvent类中的方法:有两种常用方法:

1public Object getSource() 该方法被ActionEvent事件对象调用后可以获取ActionEvent事件的事件源对象的引用,即getSource()方法可以将事件源上转型为Object对象,并返回这个上转型对象的引用。
(2public String getActionCommand() ActionEvent对象调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令。

(3)ItemEvent事件
ItemEvent事件源:选择框、下拉列表可以触发ItemEvent事件。选择框选择状态的改变和下拉列表每一项的确认选择,就可以触发该事件。
注册监视器:能触发该事件的组件使用addItemListener(ItemListener listen)将实现ItemListener接口的类的实例注册为事件源的监视器。
ItemLisenter接口:事件源触发该事件后,监视器会调用该接口中唯一的方法public void itemStateChanged(ItemEvent e)对事件进行处理。

(4)DocumentEvent事件
Document事件源:文本区含有一个实现Document接口的实例,该实例被称为文本去所维护的文档。该文档能触发DocumentEvent事件,文本区调用get Document方法返回所维护的文档。
注册监视器:能触发该事件的事件源使用addDocumentListener(DocumentLis tener listen)将实现DocumentListener接口的类的实例注册为事件源的监视器。
DocumentListener接口:该接口有三个方法:

public void changedUpdate(DocumentEvent e) //变化更新
public void removeUpdate(DocumentEvent e) //删除更新
public void insertUpdate(DocumentEvent e) //输入更新	

事件源触发该文件事件后,监视器将调用接口中的相应方法对事件作出处理。

(5)MouseEvent事件
任何组件都可以发生触发鼠标事件。所以MouseEvent类自动创建一个事件对象。事件源监视器的方法是addMouseListener(MouseListener listener)
使用MouseListener接口处理鼠标事件:该接口可以处理按下、释放、单击、进入、退出5种触发事件源的鼠标操作。
MouseEvent类的重要方法:

getX() 获取鼠标指针在事件源坐标系中的x坐标
getY() 获取鼠标指针在事件源坐标系中的y坐标
getModifiers() 获取鼠标的左键或右键。分别用InputEvent类中的常量BUTTON1_MASK和BUTTON3_MASK表示
getClickCount() 获取鼠标被单击的次数
getSource() 获取发生鼠标事件的事件源
MouseListener的重要方法:
mousePressed(MouseEvent e) 处理在组件上按下鼠标触发的鼠标事件
mouseReleased(MouseEvent e) 处理在组件上释放鼠标键触发的鼠标操作
mouseEntered(MouseEvent e) 处理鼠标进入组件触发的鼠标事件
mouseExited(MouseEvent e) 处理鼠标离开组件触发的鼠标事件
mouseClicked(MouseEvent e) 处理在组件上单击鼠标键触发的鼠标事件

MouseListener的重要方法:

mousePressed(MouseEvent e) 处理在组件上按下鼠标触发的鼠标事件
mouseReleased(MouseEvent e) 处理在组件上释放鼠标键触发的鼠标操作
mouseEntered(MouseEvent e) 处理鼠标进入组件触发的鼠标事件
mouseExited(MouseEvent e) 处理鼠标离开组件触发的鼠标事件
mouseClicked(MouseEvent e) 处理在组件上单击鼠标键触发的鼠标事件

使用MouseMotionListener接口处理鼠标事件:该接口处理在事件源上拖动和移动鼠标触发的操作。常用的方法为:

addMouseMotionListener(MouseMotionListener listener) 注册监视器 
mouseDragged(MouseEvent e) 处理拖动鼠标触发的事件
mouseMoved(MouseEvent e) 处理鼠标移动触发的事件

(6)焦点事件
组件可以触发焦点事件。组件可以使用addFocusListener(FocusListener listener)注册为焦点事件监视器。当组件获得焦点监视器后,如果组件有无输入焦点的变化都会触发FocusEvent事件。创建监视器的类必须要实现FocusListener接口,该接口有两个方法:

public void focusGained(FocusEvent e) 组件从无输入焦点变为有输入焦点时,监视器调用该方法
public void focusLost(FocusEvent e) 组件从有输入焦点变为无输入焦点时,监视器调用该方法

用户通过单击某组件使其获得焦点,同时其他组件也将失去焦点。一个组件可调用public boolean requestFocusInWindow()方法获得输入焦点

(7)键盘事件
按下、释放、敲击键盘上的一个键就触发了键盘事件。使用KeyListener接口处理键盘事件。可以使用addKeyListener(KeyListener e)注册监视器,该接口有如下三个方法:

public void keyPressed(KeyEvent e) 处理按下键盘触发的键盘事件
public void keyTyped(KeyEvent e) 处理敲击(按下又释放)触发的事件
public void keyReleased(KeyEvent e) 处理释放键盘触发的键盘事件

用KeyEvent类的public int getKeyCode()【返回键码值】或者public char getKeyChar()【返回键上字符】方法,可以判断哪个键被按下、敲击和释放

(8)窗口事件
JFrame是Window的子类,fanshiWindow子类创建的对象都可以发生Window Event事件。
WindowListener接口:当一个窗口被打开、关闭、图标化…就触发了窗口事件,即WindowEvent创建了一个窗口事件对象。调用getWindow()方法可以获取发生窗口事件的窗口。窗口使用addWindowlistener方法获得监视器,创建监视器的对象的类必须实现WindowListener接口,该接口有7个方法:

public void windowActivated(WindowEvent e) 窗口从激活到未激活状态调用该方法。
public void windowDeactivated(WindowEvent e)窗口从激活状态到未激活状态调用该方法。
public void windowClosing(WindowEvent e) 当窗口正在关闭时,调用该方法。
public void windowClosed(WindowEvent e) 当窗口关闭后,调用该方法。
public void windowIconified(WindowEvent e) 当窗口图标化后,调用该方法。
public void windowDeiconified(WindowEvent e) 当窗口撤销图标化后,调用该方法。
public void windowOpened(WindowEvent e) 当窗口打开时,调用该方法。
在调用图标化时,会同时调用撤销激活方法;在撤销图标化时,会同时调用激活方法。关闭窗口时,监视器首先调用正在关闭方法再调用关闭后方法。

WindowAdapter适配器:当Java提供处理事件的接口多于一个方法时,Java相应的提供一个适配器类。适配器已经实现了相应的接口,因此可以直接使用适配器类的子类创建的对象作为监视器,在子类中重写需要的方法即可。

(9)匿名类实例或窗口做监视器
匿名类的实例做监视器:如果内部类的实例做监视器,那么事件发生时,监视器比较容易操作事件源所在的外嵌类中的成员,就不必将对象的引用传递给监视器。
窗口做监视器:如果让组件所在的窗口作为监视器,监视器可以方便的操作窗口中的其他成员。

五、对话框

JDialog类和JFrame类都是Window的子类,二者的实例都是底层容器。对话框分为无模式和有模式两种。有模式的对话框处于激活状态时,不能激活该对话框所在程序的其他窗口。无模式的则无此限制。(通常在进行一个重要的操作前,弹出一个有模式的对话框表明操作的重要性)
(1)消息对话框
该对话框是有模式对话框,进行一个重要操作前,最好弹出一个消息对话框。使用JOptionPane类的静态方法创建一个消息对话框:public static void showMessageDialog (Component parentComponent,String message,String title,int messageType)
第一个参数指定对话框可见时的位置,第二个参数指定对话框显示的信息,第三个参数指定标题,第四个参数取值是JOptionPane类中的类常量,用于给出对话框的外观:INFORMATION_MESSAGE、WARNING_MESSAGE、ERROR_MESSAGE、QUESTION_MESSAGE、PLAIN_MESSAGE

(2)输入对话框
该对话框含有供用户输入文本的文本框、确认和取消按钮,是有模式对话框。要求输入一个字符串。用JOptionPane类的静态方法创建一个输入对话框:public static String showInputDialog(Component parentComponent,Object message,String title,int message)
第一个参数指定输入对话框所依赖的组件,第四个组件指定外观,常量的取值同上。

(3)确认对话框
该对话框为有模式对话框,JOptionPane类的静态方法创建一个确认对话框:public static int showConfirmDialog(Component parentComponent,Object message,String title,int optionType)
第一个参数指定对话框出现的位置,第四个参数可取类常量指定外观:YES_NO_OPTION、YES_NO_CANCEL_OPTION、OK_CANCEL_OPTION
该方法会返回下列整数值之一:JOptionPane.YES_OPTION、JOptionPane.NO_OPTION、JOptionPane.CANCEL_OPTION、JOptionPane.OK_OPTION、JOptionPane.CLOSED_OPTION

(4)颜色对话框
JOptionPane类的静态方法创建一个颜色对话框:public static Color showDialog(Component component,String title,Color initialColor)
第三个参数指定颜色对话框返回的初始颜色

(5)自定义对话框
通过建立JDialog的子类来建立一个对话框类,该类的一个实例就是一个对话框。对话框是一个容器,默认布局为BorderLayout。对话框的两个常用构造方法:

JDialog() 构造一个无标题的初始不可见的对话框
JDialog(JFrame owner) 构造一个无标题的初始不可见的无模式的对话框,owner是对话框所依赖的窗口。

六、树组件与表格组件

(1)树组件:JTree类的对象被称为树组件
DefaultMutableTreeNode结点:想构造一个树组件,必须事先为其创建结点对象。任何实现MutableTreeNode接口的类创建的对象都可以成为树上的结点。树中只有一个根节点,所有其他结点从这里引出。其他节点分为带子结点的分支结点和不带子结点的叶结点,每个结点有自己的文本标签和图像图标。Default MutableTreeNode类创建树上的结点,该类常用的构造方法为:

DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren) 

树上的TreeSelectionEvent事件:树组件可以触发TreeSelectionEvent事件,树使用addTreeSelectionListener(TreeSelectionListener listener)方法获得一个监视器。鼠标单击结点时,监视器将自动调用接口中的方法

(2)表格组件:
JTable常用的三个构造方法:

JTable() 创建默认的表格模型
JTable(int a,int b) 创建a行,b列的默认模型表格
JTable(Object data[][],Object columnName[]) 创建默认表格模型,并且显示由data指定的二维数组的值,其列名由columnName指定

猜你喜欢

转载自blog.csdn.net/YCF8746/article/details/113611894