java面向对象程序设计第2版第10章-javaswing图形用户界面.ppt
Java面向对象程序设计面向对象程序设计第第2 2版版第第10章章配合第第2版例子源代码一起使用版例子源代码一起使用Power point 制作:耿祥义 张跃平Java Swing图形用户界面 1导读导读210.1 Java SwingJava Swing概述概述 JavaJava的的 java.awtjava.awt包包,即即 JavaJava抽抽 象象 窗窗 口口 工工 具具 包包(AWTAWT:Abstract Abstract Window Window ToolkitToolkit)提提供供了了许许多多用用来来设计设计GUIGUI的组件类。的组件类。310.2 窗口窗口 Java提提供供的的JFrame类类的的实实例例是是一一个个底底层层容容器器,即即通通常常所所称称的的窗窗口口。其其他他组组件件必必须须被被添添加加到到底底层层容容器器中中,以便借助这个地层容器和操作系统进行信息交互。以便借助这个地层容器和操作系统进行信息交互。JFrame类类是是Container类类的的间间接接子子类类。当当需需要要一一个窗口时,可使用个窗口时,可使用JFrame或其子类创建一个对象。或其子类创建一个对象。410.2.1 JFrameJFrame常用方法常用方法 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)设置窗口的大小。public void setLocation(int x,int y)设置窗口的位置,默认位置是(0,0)。public void setVisible(boolean b)设置窗口是否可见,窗口默认是不可见的。public void setResizable(boolean b)设置窗口是否可调整大小,默认可调整大小。public void dispose()撤消当前窗口,并释放当前窗口所使用的资源。public void setExtendedState(int state)设置窗口的扩展状态.public void setDefaultCloseOperation(int operation)该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。例题例题10-110-15 例题1效果图610.2.2 菜单条、菜单、菜单项菜单条、菜单、菜单项 1 1菜菜单单条条 JComponentJComponent类类的的子子类类JMenubarJMenubar负负责责创创建建菜菜单单条条,JFrameJFrame类类有有一一个个将将菜菜单单条条放放置到窗口中的方法置到窗口中的方法:setJMenuBar(JMenuBar bar);该方法将菜单条添加到窗口的顶端该方法将菜单条添加到窗口的顶端 2 2菜单菜单:JComponentJComponent类的子类类的子类JMenuJMenu负责创建菜单负责创建菜单,JMenuJMenu类的主要方法有以下几种类的主要方法有以下几种 JMenu()建立一个空标题的菜单。建立一个空标题的菜单。JMenu(String s)建立一个指定标题菜单,标题由参数建立一个指定标题菜单,标题由参数s s确定。确定。public void add(JMenuItem item)向菜单增加由参数向菜单增加由参数itemitem指定的菜单选项指定的菜单选项。public JMenuItem getItem(int n)得到指定索引处的菜单选项。得到指定索引处的菜单选项。public int getItemCount()得到菜单选项的数目。得到菜单选项的数目。3.3.菜单项菜单项 JComponentJComponent类的子类类的子类JMenuItemJMenuItem负责创建菜单项负责创建菜单项,JMenuItemJMenuItem类的主要方法有以下几种:类的主要方法有以下几种:JMenuItem(String s)构造有标题的菜单项。构造有标题的菜单项。JMenuItem(String text,Icon icon)构造有标题和图标的菜单项构造有标题和图标的菜单项public void setEnabled(boolean b)设置当前菜单项是否可被选择。设置当前菜单项是否可被选择。public String getText()得到菜单选项的名字。得到菜单选项的名字。public void setText(String name)设置菜单选项的名字为参数设置菜单选项的名字为参数namename指定的字符串。指定的字符串。public void setAccelerator(KeyStroke keyStroke)为菜单项设置快捷键。为菜单项设置快捷键。4 4嵌嵌入入子子菜菜单单 JMenuJMenu是是JMenuItemJMenuItem的的子子类类,因因此此菜菜单单本本身身也也是是一一个个菜菜单单项项,当当把把一一个菜单看作菜单项添加到某个菜单中时,称这样的菜单为子菜单。个菜单看作菜单项添加到某个菜单中时,称这样的菜单为子菜单。5 5菜菜单单上上的的图图标标:图图标标类类IconIcon声声明明一一个个图图标标,然然后后使使用用其其子子类类ImageIconImageIcon类类创创建建一一个个图标,如:图标,如:Icon icon=new ImageIcon(“a.gif”);例题例题10-210-27 例题2效果图810.3 常用组件与布局常用组件与布局 本本节节列列出出一一些些常常用用的的组组件件,读读者者可可以以查查阅阅类类库库文文档档,了了解解这这些些组组件件的的属属性性以以及及常常用用方方法法,也也可可以以在在命命令令行行窗窗口口反反编编译译组组件件即即时时查查看看组组件件所所具具有有的属性及常用方法,例如:的属性及常用方法,例如:C:javap javax.swing.JButton 910.3.1 常用组件常用组件 1 1文本框:由文本框:由JComponentJComponent的子类的子类JTextFieldJTextField创建文本框。创建文本框。2 2文本区:由文本区:由JComponentJComponent的子类的子类JTexAreaJTexArea创建文本区。创建文本区。3 3按钮:由按钮:由JComponentJComponent的子类的子类JButtonJButton类用来创建按钮。类用来创建按钮。4 4标签:由标签:由JComponentJComponent的子类的子类JLabelJLabel类用来创建标签。类用来创建标签。5 5选择框:由选择框:由JComponentJComponent的子类的子类JCheckBoxJCheckBox类用来创建选择框。类用来创建选择框。6 6单单选选按按钮钮:由由JComponentJComponent的的子子类类JRadioButtonJRadioButton类类用用来来创创建建单单项选择框。项选择框。7 7下拉列表:下拉列表:由由JComponentJComponent的子类的子类JComboBoxJComboBox类用来创建下拉列表。类用来创建下拉列表。8 8密码框:由密码框:由JComponentJComponent的子类的子类JPasswordFieldJPasswordField创建密码框。创建密码框。密码框可以使用密码框可以使用setEchoChar(char c)setEchoChar(char c)重新设置回显字符重新设置回显字符 。密码框调用密码框调用char getPassword()char getPassword()方法可以返回实际的密码。方法可以返回实际的密码。例例子子3 3(Example10_3.javaExample10_3.java ,ComponentInWindow.javaComponentInWindow.java )包包含含有有上面提到的常用组件。上面提到的常用组件。10 例题3效果图1110.3.2 常用容器常用容器 JComponent是Container的子类,因此JComponent子类创建的组件也都是容器。容器经常用来添加组件。Jframe是底层容器,本节提到的容器被习惯地称做中间容器,中间容器必须被添加到底层容器中才能发挥作用。1 1JPanel JPanel 面面板板:使用JPanel创建面板,再向这个面板添加组件,然后把这个面板添加到其它容器中.JPanel面板的默认布局是FlowLayout布局。2 2滚动窗格滚动窗格JScrollPane:JScrollPane:可以将文本区放到一个滚动窗格中。JScorollPane scroll=new JScorollPane(new JTextArea();3 3拆分窗格拆分窗格JSplitPane:JSplitPane:窗格有两种类型水平拆分和垂直拆分JSplitPaneJSplitPane的两个常用的构造方法:的两个常用的构造方法:JSplitPane(int a,Component b,Component c)JSplitPane(int a,boolean b,Component c,Component d)4 4JLayeredPaneJLayeredPane分层窗格分层窗格:分层窗格使用add(Jcomponent com,int layer);添加组件com,并指定com所在的层 public void setLayer(Component c,int layer)可以重新设置组件c所在的层public int getLayer(Component c)可以获取组件c所在的层数。1210.3.3 常用布局常用布局_1 _1 容容器器可可以以使使用用方方法法setLayout(布布局局对对象象);设设置置自自己己的的布布局局,控制组件在容器中的位置。控制组件在容器中的位置。1 1FlowLayoutFlowLayout布局布局:1)1)创建创建布局对象布局对象 FlowLayout flow=new FlowLayout();2)容器容器concon使用布局对象使用布局对象con.setLayout(flow);3)con3)con可可以以使使用用ContainerContainer类类提提供供的的addadd方方法法将将组组件件顺顺序序地地添添加到容器中加到容器中;FlowLayoutFlowLayout布布局局对对象象调调用用相相应应的的方方法法可可以以重重新新设设置置布布局局的的对对齐方式等齐方式等.2 2BorderLayoutBorderLayout布局布局 :BorderLayout BorderLayout 布局是布局是WindowWindow型容器的默认布局型容器的默认布局 。使使用用BorderLayoutBorderLayout布布局局的的容容器器concon,可可以以使使用用addadd方方法法将将一一个个组件组件b b添加到中心区域:添加到中心区域:con.add(b,BorderLayout.CENTER);或或 con.add(BorderLayour.CENTER,b);1310.3.3 常用布局常用布局_2 _2 3 3CardLayout CardLayout 布局布局 :使用CardLayout的一般步骤如下:1)1)创建CardLayout对象 CardLayout card=new CardLayout();2)2)为容器设置布局 con.setLayout(card);3)3)容器调用add(String s,Component b)将组件b加入容器,并给出了显示该组件的代号s。4)4)布局对象card用CardLayout类提供的show()方法,显示容器con中组件代号为s的组件:card.show(con,s);4 4GridLayoutGridLayout布局布局:GridLayout布局策略是把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout布局编辑器的一般步骤如下:1)创建布局对象,指定划分网格的行数m和列数n GridLayout grid=new new GridLayout(10,8);2)使用GridLayout布局的容器调用方法add(Component c)将组件c加入容器。例题例题4 4 利用GriderLayout布局模拟的国际象棋棋盘,效果如图10.5。14 例题4效果图1510.3.3 常用布局常用布局_ _3 3 5 5BoxLayoutBoxLayout布布局局:使用盒式布局的容器将组件排列在一行或一列.BoxLayout布局的一般步骤如下:1)创建布局对象,使用BoxLayou的构造方法BoxLayout(Container con,int axis)可以创建一个盒式布局对象.2)可以使用Box类的类(静态)方法 createHorizontalBox()获得一个具有行型盒式布局的盒式容器;使用Box类的类(静态)方法 createVerticalBox()获得一个具有列型盒式布局的盒式容器。3)控制盒式布局容器中组件之间的距离 Box类调用静态方法createHorizontalStrut(int width)可以得到一个不可见的水平Struct对象,称做水平支撑.Box类调用静态方法createVertialStrut(int height)可以得到一个不可见的垂直Struct对象,称做垂直支撑。例例子子5 5 代代码码链链接接 两个列型盒式容器boxV1、boxV2和一个行型盒式容器baseBox。在列型盒式容器的组件之间添加垂直支撑,控制组件之间的距离,将boxV1、boxV2添加到baseBox中,并在它俩之间添加了水平支撑。程序运行效果如图10.6。6 6nullnull布布局局 :空布局容器可以准确地定位组件在容器的位置和大小。组件调用setBounds(int a,int b,int width,int height)方法可以设置本身的大小和在容器中的位置。16 例题5效果图1710.4 处理事件处理事件 学学习习组组件件除除了了要要熟熟悉悉组组件件的的属属性性和和功功能能外外,一一个个更更重重要要的的方方面面是是学学习习怎怎样样处处理理组组件件上上发发生生的的界界面面事事件件。当当用用户户在在文文本本框框中中键键入入文文本本后后按按回回车车键键、单单击击按按钮钮、在在一一个个下下拉拉式式列列表表中中选选择择一个条目等操作时,都发生界面事件。一个条目等操作时,都发生界面事件。程程序序有有时时需需对对发发生生的的事事件件作作出出反反应应,来来实实现现特特定定的的任任务务,例例如如,用用户户单单击击一一个个名名字字叫叫“确确定定”或或名名字字叫叫“取取消消”的的按按钮钮,程序可能需要作出不同的处理程序可能需要作出不同的处理。1810.4.1 事件处理模式事件处理模式 1 1事件源事件源:能够产生事件的对象都可以成为事件源.2 2监监视视器器 :事件源通过调用相应的方法将某个对象注册为自己的监视器。对于文本框,这个方法是:addActionListener(监视器监视器);事件源注册监视器之后,相应的操作就会导致相应的事件的发生,并通知监视器,监视器就会作出相应的处理。3 3处理事件的接口处理事件的接口:监视器负责处理事件源发生的事件。监视器是一个对象,为了处理事件源发生的事件,监视器这个对象会自动调用一个方法来处理事件。Java规定:为了让监视器这个对象能对事件源发生的事件进行处理,创建该监视器对象的类必须声明实现相应的接口,那么当事件源发生事件时,监视器就自动调用被类重写的某个接口方法(如图10.7)。19 事件处理模式效果图2010.4.2 ActionEventActionEvent事件事件 1 1 ActionEvent ActionEvent事件源事件源:文本框、按纽、菜单项、密码框和单选按纽都可以触发ActionEvent事件,即都可以成为ActionEvent事件的事件源。2 2注册监视器注册监视器:能触发ActionEvent事件的组件使用 addActionListener(ActionListener listen)将实现ActionListener接口的类的实例注册为事件源的监视器。3 3ActionListenerActionListener接口接口:ActionListener接口在包中,该接口中只有一个方法:public void actionPerformed(ActinEvent e)事件源触发ActionEvent事件后,监视器将发现触发的ActionEvent事件,然后调用接口中的方法:actionPerformed(ActinEvent e)对发生的事件作出处理。ActionEvent类事先创建的事件对象就会传递给该方法的参数e。4 4ActionEventActionEvent类中的方法类中的方法:public Object getSource()调用该方法可以获取发生ActionEvent事件的事件源对象的引用。public String getActionCommand()调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串。21 例题6 例子6中,文本框text是JTextField的实例,text的监视器listener是实现ActionLiener接口的PoliceListen类创建的对象。在text中输入数字字符串并回车,监视器负责将text中的字符串转化为数,然后计算这个数的平方,并在命令行窗口输出平方。例子6中的text对象和监视器listener都是WindowNumber类创建的窗口中的成员。程序运行效果如图10.8(a)和10.8(b)。代码链接代码链接22 例题7 例子7对例子6进行了改进,WindowNumber创建的窗口中有2个文本框,用户在可编辑的文本框中输入数字、回车确认,另一个不可编辑的文本框显示这个数的平方。例子7程序运行效果如图10.9。代码链接代码链接2310.4.3 ItemEventItemEvent事件事件 1 1ItemEventItemEvent事件源事件源:选择框、下拉列表都可以触发ItemEvent事件。2 2注册监视器注册监视器:能触发ItemEvent事件的组件使用 addItemListener(ItemListener listen)将实现ItemListener接口的类的实例注册为事件源的监视器。3 3ItemListenerItemListener接口接口:ItemListener接口在包中,该接口中只有一个方法:public void itemStateChanged(ItemEvent e)事件源触发ItemEvent事件后,监视器将发现触发的ItemEvent事件,然后调用接口中的itemStateChanged(ItemEvent e)方法对发生的事件作出处理。ItemEvent类事先创建的事件对象就会传递给该方法的参数e。4 4 ItemEventItemEvent类中的方法类中的方法:getSource()方法返回发生Itemevent事件的事件源外 getItemSelectable()方法返回发生Itemevent事件的事件源。24 例题8代码链接代码链接例子例子8 是简单的计算器(程序运行效果如图计算器(程序运行效果如图10.10),实现如下功能:(1)用户在窗口(WindowOperation类负责创建)中的两个文本框两个文本框中输入参与运算的两个操作数。(2)用户在下拉列选择在下拉列选择运算符触发触发ItemEvent事件事件,ItemEvent事件的监视器operator(OperatorListener类负责创建)获得运算符获得运算符,并将运算符传递给ActionEvent事件的监视器computer(3)用户单击按钮触发触发ActionEvent事件事件,监视器computer(ComputerrListener类负责创建)给出运算结果给出运算结果。2510.4.4 DocumentEventDocumentEvent事件事件 1 1DocumentEventDocumentEvent事事件件源源 :文本区所维护的文档能触发DocumentEvent事件 2 2注册监视器注册监视器:能触发DocumentEven事件的事件源使用 addDucumentListener(DocumentListener listen)将实现DocumentListener接口的类的实例注册为事件源的监视器。3 3DocumentListenerDocumentListener接口接口:DocumentListener接口在包中,该接口中有三个方法:public void changedUpdate(DocumentEvent e)public void removeUpdate(DocumentEvent e)public void insertUpdate(DocumentEvent e)事 件 源 触 发 DucumentEvent事 件 后,监 视 器 将 发 现 触 发 的DocumentEvent事件,然后调用接口中的相应方法对发生的事件作出处理。26 例题9代码链接代码链接 例子9中,有两个文本区。当用户在一个文本区中输入若干英文单词时(用空格、逗号或回车做为单词之间的分隔符),另一个文本区同时对用户输入的英文单词按字典序排序,也就是说随着用户输入的变化,另一个文本区不断地更新排序。程序运行效果如图10.11。2710.4.5 MouseEventMouseEvent事件事件_1 _1 任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个事件对象。1 1使用使用MouseListenerMouseListener接口可以处理以下接口可以处理以下5 5种操作触发的鼠标事件种操作触发的鼠标事件 在在事事件件源源上上按按下下鼠鼠标标键键、在在事事件件源源上上释释放放鼠鼠标标键键、在在事事件件源源上上击击鼠鼠标标键键、鼠鼠标标进进入入事件源、鼠标退出事件源。事件源、鼠标退出事件源。MouseEvent MouseEvent 中有下列几个重要的方法:中有下列几个重要的方法:getX()获取鼠标指针在事件源坐标系中的x-坐标。getY()获取鼠标指针在事件源坐标系中的y-坐标。getModifiers()获取鼠标的左键或右键。getClickCount()获取鼠标被单击的次数。getSource()获取发生鼠标事件的事件源。事件源注册监视器的方法是事件源注册监视器的方法是addMouseListener(MouseListener listener)。MouseListener MouseListener接口接口中有如下方法:中有如下方法:mousePressed(MouseEvent)负责处理在组件上按下鼠标键触发的鼠标事件 mouseReleased(MouseEvent)负责处理在组件上释放鼠标键触发的鼠标事件 mouseEntered(MouseEvent)负责处理鼠标进入组件触发的鼠标事件 mouseExited(MouseEvent)负责处理鼠标离开组件触发的鼠标事件 mouseClicked(MouseEvent)负责处理在组件上单击鼠标键触发的鼠标事件28 例题10代码链接代码链接 例子10中,分别监视按钮、文本框和窗口上的鼠标事件,当发生鼠标事件时,获取鼠标指针的坐标值,注意,事件源的坐标系的左上角是原点。2910.4.5 MouseEventMouseEvent事件事件_ _2 2 2 2使使用用MouseMotionListenerMouseMotionListener接接口口可可以以处处理理以以下下两两种种操操作作触触发发的的鼠鼠标标事事件件,在事件源上拖动鼠标、在事件源上移动鼠标。在事件源上拖动鼠标、在事件源上移动鼠标。事件源注册监视器的方法是 addMouseMotionListener(MouseMotionListener listener)MouseMotionListenerMouseMotionListener接口接口中有如下方法:mouseDragged(MouseEvent)负责处理拖动鼠标触发的鼠标事件。mouseMoved(MouseEvent)负责处理移动鼠标触发的鼠标事件。30 例题11代码链接代码链接 例子11使用坐标变换来实现组件的拖动。3110.4.6 焦点事件焦点事件 1 1焦点事件源焦点事件源:组件可以触发焦点事件。2 2注册监视器注册监视器:组件可以使用 addFocusListener(FocusListener listener)注册焦点事件监视器。3 3FocusListenerFocusListener接口接口:创建监视器的类必须要实现FocusListener接口,该接口有两个方法:public void focusGained(FocusEvent e)public void focusLost(FocusEvent e)当发生FocusEvent事件时,监视器调用类实现的接口中的相应方法。4 4组件也可调用组件也可调用 public boolean requestFocusInWindow()方法可以获得输入焦点。3210.4.7 键盘事件键盘事件 当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件触发键盘事件。1.1.某个组件使用某个组件使用addKeyListeneraddKeyListener方法注册监视器方法注册监视器。2.2.接口接口KeyListenerKeyListener中有如下方法:中有如下方法:public void keyPressed(KeyEvent e),public void keyTyped(KeyEvent e),public void KeyReleased(KeyEvent e)3.3.相关方法:相关方法:public int getKeyCode()判断哪个键被按下、敲击或释放,返回一个键码值。getKeyChar()判断哪个键被按下、敲击或释放,返回键上的字符。参考表参考表10.1 10.1 键码表键码表 33 例题12代码链接代码链接 例子12通过处理键盘事件来实现软件序列号的输入。当文本框获得输入焦点后,用户敲击键盘将使得当前文本框触发KeyEvent事件,在处理事件时,程序检查文本框中光标的位置,如果光标已经到达指定位置,就将输入焦点转移到下一个文本框。程序运行效果如图10.12。3410.4.8 窗口事件窗口事件 JFrame JFrame及子类创建的窗口可以调用及子类创建的窗口可以调用 setDefaultCloseOperation(int operation);方法设置窗口的关闭方式方法设置窗口的关闭方式,OperationOperation取取JFrameJFrame的的staticstatic常量:常量:DO_NOTHING_ON_CLOSE(什么也不做)HIDE_ON_CLOSE(隐藏当前窗口)DISPOSE_ON_CLOSE(隐藏当前窗口,并释放窗体占有的其它资源)EXIT_ON_CLOSE(结束窗口所在的应用程序)但但是是setDefaultCloseOperation方式可能不能满足程序的需要,比如,用户单击窗口上的关闭图标时,可能程序需要提示用户是否需要保存窗口中的有关数据到磁盘等.这这些些要要通通过过处处理理事事件件来来满满足足程程序序的的要要求求。需需要要注注意意的的是是,如如果果准准备备处处理理窗窗口口事事件件,必必须须事事先先保保证证窗窗口口的的默默认认关关闭闭方方式式为为DO_NOTHING_ON_CLOSE(什么也不做)什么也不做)。351 1WindowEventWindowEvent事件源事件源 (1)public void windowActivated(WindowEvent e)当窗口从非激活状态到激活时,窗口的监视器调用该方法。(2)public void windowDeactivated(WindowEvent e)当窗口激活状态到非激活状态时,窗口的监视器调用该方法。(3)public void windowClosing(WindowEvent e)当窗口正在被关闭时,窗口的监视器调用该方法。(4)public void windowClosed(WindowEvent e)当窗口关闭后,窗口的监视器调用该方法。(5)public void windowIconified(WindowEvent e)当窗口图标化时,窗口的监视器调用该方法。(6)public void windowDeiconified(WindowEvent e)当窗口撤消图标化时,窗口的监视器调用该方法。(7)public void windowOpened(WindowEvent e)当窗口打开时,窗口的监视器调用该方法。2.2.WindowListenerWindowListener接口接口.JFrame是Window的子类,凡是Window子类创建的对象都可以发生WindowEvent事件,即窗口事件。363.3.WindowAdapterWindowAdapter适配器适配器.适适配配器器可以代替接口来处理事件,当Java提供处理事件的接口中多于一个方法时,Java相应地就提供一个适配器类,比如WindowAdapter类。适适配配器器已已经经实实现现了了相相应应的的接接口口,例如WindowAdapter类实现了WindowListener接口。因此,可以使用WindowAdapte的子类创建的对象做监视器,在子类中重写所需要的接口方法即可。例子例子13(Example10_13.java)使用适配器做监视器,只处理窗口关闭事件,因此只需重写windowColsing方法即可。3710.4.9 匿名类实例或窗口做监视器匿名类实例或窗口做监视器 1 1匿匿名名类类的的实实例例做做监监视视器器:匿名类的方便之处是匿名类的外嵌类的成员变量在匿名类中仍然有效,当发生事件时,监视器就比较容易操作事件源所在的外嵌类中的成员.当事件的处理比较简单、系统也不复杂时,使用匿名类做监视器是一个不错的选择。2 2窗窗口口做做监监视视器器:让事件源所在的类的实例作为监视器,能让事件的处理比较方便,这是因为,监视器可以方便的操作事件源所在的类中的其他成员。当事件的处理比较简单,系统也不复杂时,让事件源所在的类的实例作为监视器是一个不错的选择。例子例子1414Example10_14.javaExample10_14.java 是一个猜数字小游戏是一个猜数字小游戏 3810.4.10 事件总结事件总结 1 1授权模式授权模式 JavaJava的的事事件件处处理理是是基基于于授授权权模模式式,即即事事件件源源调调用用调调用用方方法法将将某某个对象注册为自己的监视器。个对象注册为自己的监视器。2 2接口回调接口回调 addXXXListener(XXXListener listener)方方法法中中的的参参数数是是一一个个接接口口,listenerlistener可可以以引引用用任任何何实实现现了了该该接接口口的的类类所所创创建建的的对对象象,当当事事件件源源发发生生事事件件时时,接接口口listenerlistener立立刻刻回回调调被被类类实实现现的的接接口口中中的某个方法。的某个方法。3.3.方法方法绑绑定定 当事件源触当事件源触发发事件事件发发生后,生后,监视监视器准确知道去器准确知道去调调用哪个方法。用哪个方法。4.4.保持松耦合保持松耦合 当当事事件件源源触触发发事事件件发发生生后后,系系统统知知道道某某个个方方法法会会被被执执行行,但但无无须须关关心心到到底底是是哪哪个个对对象象去去调调用用了了这这个个方方法法,因因为为任任何何实实现现接接口口的的类类的的实实例例(做做为监视为监视器器)都可以都可以调调用用这这个方法来个方法来处处理事件。理事件。3910.5 使用使用MVC结构结构 模型模型-视图视图-控制器控制器(Model-View-Controller),简称为简称为MVCMVC。MVCMVC是是一一种种先先进进的的设设计计结结构构,其其目目的的是是以以会会话话形形式式提提供供方方便便的的GUIGUI支持。支持。MVCMVC是一种通过三个不同部分构造一个软件或组件的理想办法:是一种通过三个不同部分构造一个软件或组件的理想办法:模型模型(model)用于存储数据的对象。用于存储数据的对象。视图视图(view)为模型提供数据显示的对象。为模型提供数据显示的对象。控控制制器器(controller)处处理理用用户户的的交交互互操操作作,对对于于用用户户的的操操作作作作出出响响应应,让让模模型型和和视视图图进进行行必必要要的的交交互互,即即通通过过视视图图修修改改、获获取取模型中的数据;当模型中的数据变化时,让视图更新显示。模型中的数据;当模型中的数据变化时,让视图更新显示。40 例题15代码链接代码链接 首先编写一个封装三角形的类(模型角色)三角形的类(模型角色)然后再编写一个窗口。要求窗口使用三三文文本本框框和一个文文本本区区为三角形对象中的数据提供视视图图,其中三个文本框用来显示和更新三角形对象的三个边的长度;文本区对象用来显示三角形的面积。窗口中有一个按按钮钮(控控制制器器角角色色),用户单击该按钮后,程序用3个文本框中的数据分别作为三角形的三个边的长度,并将计算出的三角形的面积显示在文本区中。程序运行效果如图10.14。41 10.6 树组件与表格组件树组件与表格组件 10 10.6.1 树组件树组件 1DefaultMutableTreeNode节点节点 DefaultMutableTreeNode类的两个常用的构造方法是:2树上的树上的TreeSelectionEvent事件事件 使用addTreeSelectionListener(TreeSelectionListener listener)方法获 得 一 个 监 视 器。当 用 鼠 标 单 击 树 上 的 节 点 时,系 统 将 自 动 用TreeSelectionEvent创建一个事件对象,通知树的监视器,监视器将自动调用TreeSelectionListener接口中的方法。创建监视器的类必须实现TreeSelectionListener接口,此接口中的方法是 public void valueChanged(TreeSelectionEvent e)。树使用getLastSelectedPathComponent()方法获取选中的节点。DefaultMutableTreeNode(Object userObject)DefaultMutableTreeNode(Object userObject,boolean allowChildren)42 例题16代码链接代码链接 例16中节点中存放的对象由Goods类(描述商品)创建,当用户选中节点时,窗口中的文本区显示节点中存放的对象的有关信息,程序运行效果如图10.15。4310.6.2 表格组件表格组件 表格组件以行和列的形式显示数据,允许对表格中的数据进行编辑。表格的模型功能强大、灵活并易于执行。表格是最复杂的组件,对于初学者,这里只介绍默认的表格模型。JTable有7个构造方法,这里介绍常用的三个。JTabl