Java实用PPT课件第10章_第1页
Java实用PPT课件第10章_第2页
Java实用PPT课件第10章_第3页
Java实用PPT课件第10章_第4页
Java实用PPT课件第10章_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2020/5/1,1,第10章基于Swing的图形用户界面设计,本章导读AWT组件与SWING组件JFrame窗体、菜单组件、布局设计中间容器、文本组件按钮与标签组件、复选框与单选按钮组件列表组件、表格组件、树组件和进度条组件窗口事件、鼠标事件、焦点事件和键盘事件对话框AWT线程与计时器MVC设计模式发布应用程序,2020/5/1,2,10.1AWT组件与SWING组件概述,Java早期进行用户界面设计时,使用java.awt包中提供的类。“AWT”就是AbstracWindowToolkit(抽象窗口工具包)的缩写。Java2(JDK1.2)推出之后,增加了一个新的javax.swing包,该包提供了功能更为强大的用来设计GUI界面的类。Java早期的java.awt包中的类创建的组件习惯上称为重组件。例如,当用java.awt包中的Button类创建一个按钮组件时,都有一个相应的本地组件在为它工作(称为它的同位体)。javax.swing包为我们提供了更加丰富的、功能强大的组件,称为SWING组件,其中大部分组件是轻组件,没有同位体。SWING组件的轻组件在设计上和AWT完全不同,轻组件把与显示组件有关的许多工作和处理组件事件的工作交给相应的UI代表来完成。这些UI代表是用Java语言编写的类,这些类被增加到Java的运行环境中,因此组件的外观不依赖平台,不仅在不同平台上的外观是相同的,而且较组件有更高的性能。如果Java运行环境低于1.2版本,就不能运行含有SWING组件的程序。,2020/5/1,3,图10.1JComponent类的部分子类以及JFrame类和JDialog类,2020/5/1,4,容器类(Container)和组件类(Component),Java把由Component类的子类或间接子类创建的对象称为一个组件;把由Container的子类或间接子类创建的对象称为一个容器。可以向容器添加组件。Container类提供了一个public方法add(),一个容器可以调用这个方法将组件添加到该容器中。调用removeAll()方法可以移掉容器中的全部组件,调用remove(Componentc)方法可以移掉容器中参数指定的组件。每当容器添加新的组件或移掉组件时,应该让容器调用validate()方法,以保证容器中的组件能正确显示出来。容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。javax.swing包中有4个最重要的类JApplet,JFrame,JDialog和JComponent。注:JComponent类的子类都是轻组件,JComponent类是java.awt包中Container类的子类,因此所有的轻组件也都是容器。而JFrame、JApplet、JDialog都是重组件,即有同位体的组件,这样窗口(JFrame)、对话框(JDialog)、小应用程序(JavaApplet)可以和操作系统交互信息。轻组件必须在这些容器中绘制自己,习惯上称这些容器为SWING的底层容器。,2020/5/1,5,10.2JFrame窗体,javax.swing包中的JFrame类是java.awt包中Frame类的子类,因此JFrame类其子类创建的对象是窗体。当应用程序需要一个窗口时,可使用JFrame或其子类创建一个对象。窗口默认地被系统添加到显示器屏幕上,因此不允许将一个窗口添加到另一个容器中。Frame类常用方法如下:JFrame()创建一个无标题的窗口。JFrame(Strings)创建一个标题为s的窗口。publicvoidsetBounds(inta,intb,intwidth,intheight)设置出现在屏幕上时的初始位置为(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。publicvoidsetSize(intwidth,intheight)设置窗口的大小,在屏幕出现默认位置是(0,0)。publicvoidsetVisible(booleanb)设置窗口是可见还是不可见,窗口默认是不可见的。publicvoidsetResizable(booleanb)设置窗口是否可调整大小,窗口默认是可调整大小的。publicvoidsetDefaultCloseOperation(intoperation)该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。其中的参数operation取下列有效值:1)DO_NOTHING_ON_CLOSE什么也不做2)HIDE_ON_CLOSE隐藏当前窗口3)DISPOSE_ON_CLOSE隐藏当前窗口,并释放窗体占有的其他资源4)EXIT_ON_CLOSE结束窗体所在的应用程序这4个常量都是JFrame类中的static常量,单击关闭图标后,程序根据operation取值做出不同的处理。例子10-1用JFrame创建了两个窗口,程序运行效果如图10.2。,2020/5/1,6,例子10-1运行效果图10.2,2020/5/1,7,10.3菜单组件,窗口中的菜单条、菜单、菜单项是我们所熟悉的界面,菜单条、菜单、菜单项是窗口常用的组件,菜单放在菜单条里,菜单项放在菜单里。1JMenuBar菜单条JComponent类的子类JMenuBar是负责创建菜单条的,即JMenuBar的一个实例就是一个菜单条。JFrame类有一个将菜单条放置到窗口中的方法:publicvoidsetJMenuBar(JMenuBarmenubar);该方法将菜单条添加到窗口的菜单条区域(注意:只能向窗口添加一个菜单条)。,2020/5/1,8,2.JMenu菜单,JComponent类的子类JMenu类是负责创建菜单的,即JMenu的一个实例就是一个菜单。JMenu类的主要方法有以下几种:JMenu(Strings)建立一个指定标题菜单,标题由参数s确定publicvoidadd(MenuItemitem)向菜单增加由参数item指定的菜单选项对象。publicvoidadd(Strings)向菜单增加指定的选项。publicJMenuItemgetItem(intn)得到指定索引处的菜单选项。publicintgetItemCount()得到菜单选项数目。,2020/5/1,9,3.JMenuItem菜单项,JMenuItem是JMenu的父类,该类是负责创建菜单项的,即JMenuItem的一个实例就是一个菜单项。菜单项放在菜单里。JMenuItem类的主要方法有以下几种:JMenuItem(Strings)构造有标题的菜单项。JMenuItem(Stringtext,Iconicon)构造有标题和图标的菜单项publicvoidsetEnabled(booleanb)设置当前菜单项是否可被选择。publicStringgetLabel()得到菜单项的名字。publicvoidsetAccelerator(KeyStrokekeyStroke)为菜单项设置快捷键。为了向该方法的参数传递一个KeyStroke对象,可以使用KeyStroke类的类方法publicstaticKeyStrokegetKeyStroke(charkeyChar)返回一个KeyStroke对象;也可以使用KeyStroke类的类方法publicstaticKeyStrokegetKeyStroke(intkeyCode,intmodifiers)返回一个KeyStroke对象,其中参数keyCode取值范围为KeyEvent.VK_AKeyEvent.VK_Z,modifiers的取值如下:InputEvent.ALT_MASK,InputEvent.CTRL_MASK和InputEvent.SHIFT_MASK。,2020/5/1,10,4.嵌入子菜单,JMenu是JMenuItem的子类,因此菜单项本身还可以是一个菜单,这样的菜单项称为子菜单。为了使得菜单项有一个图标,可以用图标类Icon声明一个图标,然后使用其子类ImageIcon类创建一个图标,如Iconicon=newImageIcon(dog.gif);下面的例10-2中有一个含有菜单的窗口(效果如图10.3所示)。,2020/5/1,11,10.4布局设计,当把组件添加到容器中时,希望控制组件在容器中的位置,这就需要学习布局设计的知识。本节将介绍java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout布局类和java.swing.border包中的BoxLayout布局类。容器可以使用方法setLayout(布局对象);来设置自己的布局。对于JFrame窗口,默认布局是BorderLayout布局。,2020/5/1,12,1FlowLayout布局,FlowLayout类的对象称为FlowLayout布局。FlowLayout类的一个常用构造方法如下:FlowLayout();构造方法可以创建一个居中对齐的布局对象,如:FlowLayoutflow=newFlowLayout();con.setLayout(flow);容器con使用flow这个布局对象容器con可以使用Container类提供的add()方法将组件顺序地添加到容器中。FlowLayout布局对象调用setAlignment(intaligin)方法可以重新设置布局的对齐方式,其中aligin可以取值FlowLayout.LEFT、FlowLayout.CENTER或FlowLayout.RIGHT。FlowLayout布局对象调用setHgap(inthgap)方法和setVgap(intvgap)方法可以重新设置布局的水平间隙和垂直间隙。如果需要改变最佳大小,组件需调用:publicvoidsetPreferredSize(DimensionpreferredSize)设置大小,例如:button.setPreferredSize(newDimension(20,20);注:对于添加到使用FlowLayout布局的容器中的组件,组件调用setSize(intx,inty)设置的大小无效。例10-3中,JFrame使用FlowLayout布局放置10个组件(效果如图10.4所示)。,2020/5/1,13,例子10-3运行效果图10.4,2020/5/1,14,2BorderLayout布局,BorderLayout布局是Window容器的默认布局。JFrame、JDialog都是Window类的间接子类,它们的内容面板的默认布局都是BorderLayout布局。如果一个容器使用这种布局,那么容器空间简单地划分为东、西、南、北、中五个区域。每加入一个组件都应该指明把这个组件添加在哪个区域中,区域由BorderLayout中的静态常量CENTER、NORTH、SOUTH、WEST、EAST表示。例如,一个使用BorderLayout布局的容器con,可以使用add()方法将一个组件b添加到中心区域:con.add(b,BorderLayout.CENTER);或con.add(BorderLayour.CENTER,b);注:添加到某个区域的组件将占据整个这个区域.每个区域只能放置一个组件,如果向某个已放置了组件的区域再放置一个组件,那么先前的组件将被后者替换。注:使用BorderLayout布局的容器最多能添加5个组件,如果容器中需要添加的组件超过5个,就必须使用容器的嵌套或改用其他布局策略。例10-4使用了BorderLayout布局(效果如图10.5所示)。,2020/5/1,15,例子10-4运行效果图10.5,2020/5/1,16,3CardLayout布局,使用CardLayout容器可以容纳多个组件,但同一时刻容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。JTabbedPane窗格的默认布局是CardLayout布局,并且自带一些选项卡,这些选项卡与用户添加到JTabbedPane窗格中的组件相对应,单击该选项卡,JTabbedPane窗格将显示对应的组件。选项卡窗格自带的选项卡默认地在该选项卡窗格的顶部,从左向右依次排列,选项卡的顺序和所对应的组件的顺序相同。JTabbedPane窗格可以使用add(Stringtext,Componentc);方法将组件c添加到JTabbedPane窗格中,并指定和组件c对应的选项卡的文本提示是text。使用JTabbedPane窗格的构造方法publicJTabbedPane(inttabPlacement)创建的选项卡窗格的选项卡的位置由参数tabPlacement指定,该参数的有效值为JTabbedPane.TOP、JTtabbedPane.BOTTOM、JTabbedPane.LEFT和JTabbedPane.RIGHT。例10-5在选项卡窗格中添加了5个按钮(带有图标),并设置了相对应的选项卡的文本提示,然后将选项卡窗格添加到窗体的内容面板中(效果如图10.6所示)。,2020/5/1,17,例子10-5运行效果图10.6,2020/5/1,18,4GridLayout布局,GridLayout是使用较多的布局编辑器,其基本布局策略是把容器划分成若干行若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout比较灵活,划分多少网格由程序自由控制,而且组件定位也比较精确,使用GridLayout布局编辑器的一般步骤如下:(1)使用GridLayout的构造方法GridLayout(intm,intn)创建布局对象,指定划分网格的行数m和列数n,如GridLayoutgrid=newGridLayout(10,8);(2)使用GridLayout布局的容器调用方法add()将组件加入容器,组件进入容器的顺序将按照第一行第一个、第一行第二个第一行最后一个、第二行第一个最后一行第一个最后一行最后一个。使用GridLayout布局的容器最多可添加mn个组件。GridLayout布局中每个网格都是相同大小,并且强制组件与网格的大小相同。由于GridLayout布局中每个网格都是相同大小并且强制组件与网格的大小相同,使得容器中的每个组件也都是相同的大小,显得很不自然。为了克服这个缺点,可以使用容器嵌套。例如,一个容器使用GridLayout布局,将容器分为三行一列的网格,那么可以把另一个容器添加到某个网格中,而添加的这个容器又可以设置为GridLayout布局、FlowLayout布局、CarderLayout布局或BorderLayout布局等。利用这种嵌套方法,可以设计出符合一定需要的布局.,2020/5/1,19,5BoxLayout布局,用BoxLayout类可以创建一个布局对象,称为盒式布局。BoxLayout在java.swing.border包中。javaswing包提供了Box类,该类也是Container类的一个子类,创建的容器称为一个盒式容器。盒式容器的默认布局是盒式布局,而且不允许更改盒式容器的布局。因此,在策划程序的布局时,可以利用容器的嵌套,将某个容器嵌入几个盒式容器,达到布局目的。BoxLayou的构造方法BoxLayout(Containercon,intaxis)可以创建一个盒式布局对象,并指定容器con使用该布局对象,参数axis的有效值是BoxLayout.X_AXIS和BoxLayout.Y_AXIS。Box类的类(静态)方法createHorizontalBox()可以获得一个具有行型盒式布局的盒式容器;Box类的类(静态)方法createVerticalBox()可以获得一个具有列型盒式布局的盒式容器。控制盒式布局容器中组件之间的距离,需要使用水平支撑或垂直支撑。Box类调用静态方法createHorizontalStrut(intwidth)可以得到一个不可见的水平Struct类型对象.称为水平支撑.该水平支撑的高度为0,宽度是width。Box类调用静态方法createVertialStrut(intheight)可以得到一个不可见的垂直Struct类型对象,称为垂直支撑.参数height决定垂直支撑的高度,垂直支撑的宽度为0。例10-6中(效果如图10.7所示),有两个列型盒式容器boxV1、boxV2和一个行型盒式容器baseBox。在列型盒式容器的组件之间添加垂直支撑,控制组件之间的距离,将boxV1、boxV2添加到baseBox中,并在它们之间添加水平支撑。,2020/5/1,20,例子10-6运行效果图10.7,2020/5/1,21,6null布局,可以把一个容器的布局设置为null布局(空布局)。空布局容器可以准确地定位组件在容器的位置和大小。setBounds(inta,intb,intwidth,intheight)方法是所有组件都拥有的一个方法,组件调用该方法可以设置本身的大小和在容器中的位置。例如,p是某个容器:p.setLayout(null);把p的布局设置为空布局。向空布局的容器p添加一个组件c需要两个步骤。首先使用add(c)方法向容器添加组件,然后组件c再调用setBounds(inta,intb,intwidth,intheight)方法设置该组件在容器中的位置和本身的大小。组件都是一个矩形结构,方法中的参数a和b是被添加的组件c的左上角在容器中的位置坐标,即该组件距容器左面a个像素,距容器上方b个像素;weidth和height是组件c的宽和高。,2020/5/1,22,10.5中间容器_1JPanel面板,2JScrollPane窗格,3JSplitPane窗格,轻组件都是容器,但仍有一些经常用来添加组件的轻容器,相对于底层重容器而言,我们习惯上称这些轻容器为中间容器。SWING提供了许多功能各异的中间容器,而且容易学习掌握。本节将简单介绍JPanel面板、JScrollPane滚动窗格、JSplitPane拆分窗格和JLayeredPane分层窗格。1JPanel面板可以使用JPanel创建一个面板,再向这个面板添加组件,然后把这个面板添加到底层容器或其他中间容器中。JPanel面板的默认布局是FlowLayout布局。JPanel类构造方法Jpanel()可以构造一个面板容器对象。2JScrollPane窗格可以把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。JScorollPane的构造方法JScorollPane(componentc)可以构造一个滚动窗格。3JSplitPane窗格拆分窗格有两种类型水平拆分和垂直拆分。水平拆分窗口用一条拆分线把容器分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动。垂直拆分窗格由一条拆分线分成上下两部分,上面放一个组件,下面放一个组件,拆分线可以垂直移动。JSplitPane的构造方法JSplitPane(inta,Componentb,Componentc)可以构造一个拆分窗格,参数a取JSplitPane的静态常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以决定是水平还是垂直拆分。后两个参数决定要放置的组件。拆分窗格调用setDividerLocation(doubleposition)设置拆分线的位置。,2020/5/1,23,4JLayeredPane分层窗格,如果添加到容器中的组件经常需要处理重叠问题,就可以考虑将组件添加到JLayeredPane容器。JLayeredPane容器将容器分成5个层,容器使用add(Jcomponentcom,intlayer);添加组件com,并指定com所在的层,其中参数layer取值JLayeredPane类中的类常量:DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER。DEFAULT_LAYER是最底层,添加到DEFAULT_LAYER层的组件如果和其他层的组件发生重叠时,将被其他组件遮挡。DRAG_LAYER层是最上面的层,如果JLayeredPane中添加了许多组件,鼠标移动一组件时,可以把移动的组件放到DRAG_LAYER层。这样,组件在移动过程中,就不会被其他组件遮挡。添加到同一层上的组件,如果发生重叠,先添加的会遮挡后添加的组件。JLayeredPane对象调用publicvoidsetLayer(Componentc,intlayer)可以重新设置组件c所在的层,调用publicintgetLayer(Componentc)可以获取组件c所在的层数。例10-7在JLayeredPane容器中添加了5个组件,分别位于不同的层上(效果如图10.8所示),2020/5/1,24,例子10-7运行效果图10.8,2020/5/1,25,10.6文本组件_1JTextField文本框,2JPasswordField密码框,1JTextField文本框JComponent的子类JTextField是专门用来建立文本框的,即JTextField创建的一个对象就是一个文本框。用户可以在文本框输入单行的文本。JTextField类的主要方法如下:JTextField(intx)创建文本框对象,可以在文本框中输入若干个字符,文本框的可见字符个数由参数x指定。JTextField(Strings)创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。publicvoidsetText(Strings)设置文本框中的文本为参数s指定的文本,文本框中先前的文本将被清除。publicStringgetText()获取文本框中的文本。publicvoidsetEditable(booleanb)指定文本框的可编辑性。创建的文本框默认是可编辑的。publicvoidsetHorizontalAlignment(intalignment)设置文本在文本框中的对齐方式,alignment的有效值为JTextField.LEFT、JTextField.CENTER和JTextField.RIGHT。2JPasswordField密码框使用JTextField的子类JPasswordField可以建立一个密码框对象。密码框可以使用setEchoChar(charc)设置回显字符(默认的回显字符是*),chargetPassword()方法返回密码框中的密码。,2020/5/1,26,3ActionEvent事件,当用户在有输入焦点的文本框中按回车键、单击按钮、在一个下拉式列表中选择一个条目等操作时,都发生界面事件。程序有时要对发生的事件做出反应,来实现特定的任务。在学习处理事件时,读者必须很好地掌握事件源、监视器、处理事件的接口这三个概念。JTextField和JPasswordField触发ActionEvent事件,通过处理文本框这个具体的组件上的事件,来掌握处理事件的基本原理。,2020/5/1,27,3ActionEvent事件_处理事件的基本原理,1)事件源:能够产生事件的对象都可以称为事件源,如文本框、按钮、下拉式列表等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。2)监视器:我们需要一个对象对事件源进行监视,以便对发生的事件做出处理。事件源通过调用相应的方法将某个对象作为自己的监视器。例如,对于文本框,这个方法是:addActionListener(ActioListenerlistener)对于获取了监视器的文本框对象,在文本框获得输入焦点之后,如果用户按回车键,Java运行系统就自动用ActionEvent类创建了一个对象,即发生了ActionEvent事件。也就是说,事件源获得监视器之后,相应的操作就会导致事件的发生,并通知监视器,监视器就会做出相应的处理。3)处理事件的接口:发生ActionEvent事件的事件源对象获得监视器方法是:addActionListener(ActionListenerlistener);该方法中的参数是ActionListener类型的接口,因此必须将一个实现ActionListener接口的类创建的对象传递给该方法的参数,使得该对象成为事件源的监视器。监视器负责调用特定的方法处理事件,创建监视器的类必须提供处理事件的特定方法,即实现接口方法。Java采用接口回调技术来处理事件,当事件源发生事件时,接口立刻通知监视器自动调用实现的某个接口方法,接口方法规定了怎样处理事件的操作。,2020/5/1,28,3ActionEvent事件_事件处理模式图10.9,接口回调这一过程对程序是不可见的,Java在设计组件事件时已经设置好了这一回调过程,程序只需让事件源获得正确的监视器,即将实现了正确接口的对象的引用传递给方法addActionListener(ActionListenerlistener)中的参数listener。,我们称文本框和密码框事件源可以发生ActionEvent类型事件。为了能监视到这种类型的事件,事件源必须使用addActionListener()方法获得监视器;创建监视器的类必须实现接口ActionListener。事件处理模式如图10.9所示.,2020/5/1,29,3ActionEvent事件_ActionEvent类中的方法,4)ActionEvent类中的方法ActionEvent事件对象调用方法publicObjectgetSource()可以返回发生ActionEvent事件的对象的引用。ActionEvent事件对象调用方法publicStringgetActionCommand()获取发生ActionEvent事件时,和该事件相关的一个命令字符串,对于文本框,当发生ActionEvent事件时,用户在文本框中输入的文本字符串就是和该事件相关的一个命令字符串。例10-8中,窗口中有一个文本框text,text的事件监视器由PoliceStation类负责创建。当用户在text中输入字符串回车后,监视器负责在命令输出该字符串以及它的长度(效果如图10.10所示)。例10-9中,titleText和passwordText有监视器。当在titleText中输入字符串回车后,监视器负责将窗体的标题更改为当前titleText中的文本。当在passwordText中输入密码回车后,监视器负责将密码显示在titleText中(效果如图10.11所示)。例10-10使用匿名对象作为inputText的监视器,当在inputText中输入一个数字字符串后,监视器负责计算这个数的平方,并将结果放入showText中(效果如图10.12所示)。,2020/5/1,30,例子10-8,9,10运行效果图10.10,10.11,10.12,2020/5/1,31,4菜单项上的ActionEvent事件,单击某个菜单项可以发生ActionEvent事件。菜单项使用addActionListener(ActionListenerlistner)方法获得监视器。,2020/5/1,32,5JTextArea文本区_1JTextArea常用方法,JTextArea类专门用来建立文本区,用户可以在文本区输入多行的文本.JTextArea(introws,intcolumns)构造一个可见行和可见列分别是rows和columns的文本区。文本区对象可以使用下列方法:setLineWrap(booleanb)决定输入的文本能否在文本区的右边界自动换行;setWrapStyleWord(booleanb)决定是以单词为界或以字符为界进行换行(b取true/false)。getText()和setText(Strings)获取并替换文本区的文本append(Strings)尾加文本insert(Strings,intx)在文本区的指定位置处插入文本replaceRange(StringnewString,intstart,intend)将文本区start至end处的文本替换为新文本newStringgetCaretPosition()获取文本区中输入光标的位置setCaretPosition(intposition)设置文本区中输入光标的置(position不能大于文本区中字符的个数)copy()和cut()方法将文本区中选中的内容复制或剪切到系统的剪贴板paste()将系统剪贴板上的文本数据粘贴在文本区中。setSelectionStart(intselectionStart)和setSelectionEnd(intselectionEnd)方法设置选中的文本select(intselectionStart,intselectionEnd)和selectAll()选中部分或全部文本例10-11中,单击菜单“编辑”中的相应菜单项将文本区中选中的内容剪切、复制到系统剪贴板或将系统剪贴板的内容粘贴到文本区,效果如图10.13所示.,2020/5/1,33,例子10-11运行效果图10.13,2020/5/1,34,5JTextArea文本区_2文本区的DucumentEvent事件,文本区可以触发DucumentEvent事件,DucumentEven类在javax.swing.event包中。用户在文本区组件的UI代表的视图中进行文本编辑操作,使得文本区中的文本内容发生变化,将导致该文本区所维护的文档模型中的数据发生变化,从而导致DucumentEvent事件的发生。文本区调用addDucumentListener(DucumentListenerlistener)向文本区维护的文档注册监视器。监视器需实现DucumentListener接口,该接口中有3个方法:publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)getDocument()返回维护的文档,该文档是实现了Document接口类的一个实例。,例10-12中,有两个文本区和一个文本框。当用户在文本区inputText进行编辑操作时,文本区showText将显示第一个文本区中所有和指定模式匹配的字符串。用户可以事先在一个文本框patternText中输入指定的模式,比如,输入:sdpPunct+,即通过该模式获得文本区inputText中的全部单词,效果如图10.14所示。,2020/5/1,35,事件处理模式图10.9,2020/5/1,36,10.7按钮与标签组件_1JButton按钮,JButton类是专门用来建立按钮的,即JButton类创建的一个对象就是一个按钮。JButton类常用的方法如下:Button(Stringtext)创建名字是text的按钮。publicJButton(Iconicon)创建带有图标icon的按钮。publicJButton(Stringtext,Iconicon)创建名字是text且带有图标icon的按钮publicvoidsetText(Stringtext)重新设置当前按钮的名字,名字由参数text指定。publicStringgetText()获取当前按钮上的名字。publicvoidsetIcon(Iconicon)重新设置当前按钮上的图标。publicIcongetIcon()获取当前按钮上的图标publicvoidsetHorizontalTextPosition(inttextPosition)设置按钮名字相对按钮上图标的水平位置。publicvoidsetVerticalTextPosition(inttextPosition)设置按钮上名字相对按钮上图标的垂直位置。publicvoidsetMnemonic(charmnemonic)设置按钮的键盘激活方式,mnemonic的有效值为az。如果按钮用此方法设置了键盘激活方式,如参数mnemonic取值o,那么在键盘操作ALT+O就可激活按钮。publicvoidaddActionListener(ActionListener)向按钮增加动作监视器。publicvoidremoveActionListener(ActionListener)移去按钮上的动作监视器。按钮可以发生ActionEvent事件,当按钮获得监视器之后,用鼠标单击按钮或按钮获得焦点时按下空格键(Space键),就发生ActionEven事件,即java.awt.envent包中的ActionEvent类自动创建了一个事件对象。例10-13中,单击按钮切换按钮上的图标,效果如图10.15所示。,2020/5/1,37,例子10-13运行效果图10.15,2020/5/1,38,2JLabel标签,JLabel类负责创建标签对象,标签用来显示信息,但没有编辑功能。JLabel类的构造方法如下:publicJLabel()创建没有名字的标签。publicJLabel(Strings)创建名字是s的标签,s在标签中靠左对齐。publicJLabel(Strings,intaligment)参数aligment决定标签中的文字在标签中的水平对齐方式。aligment的取值是JLabel.CENTER、JLabel.LEFT或JLabel.RIGHT。publicJLabel(Iconicon)创建具有图标icon的标签,icon在标签中靠左对齐。publicJLabel(Strings,Iconicon,intaligment)创建名字是s,具有图标icon的标签。参数aligment决定标签中的文字和图标作为一个整体在标签中的水平对齐方式(名字总是在图标的右面)。JLabel类的常用实例方法如下:StringgetText()获取标签的名字。voidsetText(Strings)设置标签的名字是s。IcongetIcon()获取标签的图标。voidsetIcon(Iconicon)设置标签的图标是icon。voidsetHorizontalTextPosition(inta)参数a确定名字相对于标签上的图标的位置。a的取值是JLabel.LEFT或JLabel.RIGHT。voidsetVerticalTextPosition(inta)参数a确定名字相对于JLabel上的图标的位置。参数a取值是JLabel.BOTTOM或JLabel.TOP。,2020/5/1,39,10.8复选框与单选按钮组件_1JCheckBox复选框,复选框提供两种状态一种是选中,另一种是未选中,用户通过单击该组件切换状态。JCheckBox类常用方法如下:publicJCheckBox()创建一个没有名字的复选框,初始状态是未选中。publicJCheckBox(Stringtext)创建一个名字是text的复选框,初始状态是未选中。publicJCheckBox(Iconicon)创建一个带有默认图标icon但没有名字的复选框,初始状态是未选中。publicJCheckBox(Stringtext,Iconicon)创建一个带有默认图标和名字text的复选框,初始状态是未选中。publicvoidsetIcon(IcondefaultIcon)设置复选框上的默认图标。publicvoidsetSelectedIcon(IconselectedIcon)设置复选框选中状态下的图标。该方法可能经常被使用,因为如果不明显地设置选中状态时的图标,复选框无论是选中状态还是未选种状态总是显示复选框上的默认图标,用户很难知道复选框是处于怎样的状态。publicbooleanisSelected()如果复选框处于选中状态该方法返回true,否则返回false。如果复选框没有指定默认图标,复选框就显示为一个“小方框”,如果是选中状态,“小方框”里面就有个小对号。,2020/5/1,40,复选框与单选按钮组件_ItemEvent事件,当复选框获得监视器之后,复选框从未选中状态变成选中状态或从选中状态变成未选中状态时就发生ItemEvent事件,ItemEvent类将自动创建一个事件对象。发生ItemEvent事件的事件源获得监视器的方法是addItemListener(ItemListenerlistener)由于复选框可以发生ItemEvent事件,JCheckBox类提供了addItemListener()方法。处理ItemEvent事件的接口是ItemListener,创建监视器的类必须实现ItemListener接口,该接口中只有一个的方法。当在复选框发生ItemEvent事件时,监视器将自动调用接口方法publicvoiditemStateChanged(ItemEvente)对发生的事件做出处理。ItemEvent事件对象除了可以使用getSource()方法返回发生Itemevent事件的事件源外,也可以使用getItemSelectable()方法返回发生Itemevent事件的事件源。,例10-14处理了复选框上的ItemEvent事件,当复选框被选中时,窗口中心显示一个带图标的标签,否则隐藏这个带图标的标签,效果如图10.16所示。,2020/5/1,41,10.8复选框与单选按钮组件_2JRadioButton单选按钮,单选按钮和复选框很类似,所不同的是在若干个复选框中我们可以同时选中多个,而一组单选按钮同一时刻只能有一个被选中。当创建了若干个单选按钮后,应使用ButtonGroup类再创建一个对象,然后利用这个对象把这若干个单选按钮归组。归到同一组的单选按钮每一时刻只能选一。单选按钮和复选框一样,也触发ItemEvent事件。ButtonGroupfruit=newButtonGroup();JRadioButtonbutton1=newJRadioButton(小学),button2=newJRadioButton(中学),button3=newJRadioButton(大学);fruit.add(button1);fruit.add(button2);fruit.add(button3);,2020/5/1,42,10.9列表组件,下拉列表是用户十分熟悉的一个组件。用户可以在下拉列表看到第一个选项和它旁边的箭头按钮,当用户单击箭头按钮时,选项列表打开。下拉列表的常用方法如下:publicJComboBox()创建一个没有选项下拉列表。publicvoidaddItem(ObjectanObject)增加选项。publicintgetSelectedIndex()返回当前下拉列表中被选中的选项的索引,索引的起始值是0。publicObjectgetSelectedItem()返回当前下拉列表中被选中的选项。publicvoidremoveItemAt(intanIndex)从下拉列表的选项中删除索引值是anIndex的选项。publicvoidremoveAllItems()删除全部选项。publicvoidaddItemListener(ItemListener)向下拉列表增加ItemEvent事件的监视器。下拉式列表事件源可以发生ItemEvent事件。当下拉列表获得监视器后,用户在下拉列表的选项中选中某个选项时就发生ItemEvent事件,ItemEvent类将自动创建一个事件对象。例10-15中,列表的选项是Java源文件的名字。当选择一个选项后,程序在一个文本区里显示所选择的Java源文件的全部内容,效果如图10.17所示。,2020/5/1,43,例子10-15运行效果图10.17,2020/5/1,44,10.10表格组件,使用JTable可以创建一个表格对象。可以使用JTable的下列构造方法JTable(Objectdata,ObjectcolumnName)创建表格。表格的视图将以行和列的形式显示数组data每个单元中对象的字符串表示,也就是说,表格视图中对应着data单元中对象的字符串表示。参数columnName用来指定表格的列名。用户在表格单元中输入的数据都被认为是一个Object对象,用户通过表格视图对表格单元中的数据进行编辑,以修改二维数组data中对应的数据,在表格视图中输入或修改数据后,需按回车键或用鼠标单击表格的单元格确定所输入或修改的结果。当表格需要刷新显示时,调用repaint()方法。,例10-16是一个商品销售核算录入程序,客户通过一个表格视图的单元格输入每件商品的名称、单价和销售量。单击“每件商品销售额”按钮,表格视图每行的最后一个单元将显示该商品的总销售额;单击“总销售额”按钮,表格视图将计算最后一列值的和,同时表格增加一行,该行的最后一个单元显示总销售额,效果如图10.18所示。,2020/5/1,45,10.11树组件_1树与节点,JTree类的实例称为树组件。树组件也是常用的组件之一,它由节点构成。树组件的外观远比按钮要复杂得多。要想构造一个树组件,必须事先创建出称为节点的对象。任何实现MutableTreeNode接口的类创建的对象都可以成为树上的节点,树中最基本的对象是节点,它表示在给定层次结构中的数据项。树以垂直方式显示数据,每行显示一个节点。树中只有一个根节点,所有其他节点从这里引出。除根节点外,其他节点分为两类一类是带子节点的分支节点,另一类是不带子节点的叶节点。每一个节点关联着一个描述该节点的文本标签和图像图标。文本标签是节点中对象的字符串表示,图标指明该节点是否是叶节点。树组件的节点中可以存放对象,javax.swing.tree包提供的DefaultMutableTreeNode类是实现了MutableTreeNode接口的类,可以使用这个类创建树上的节点。DefaultMutableTreeNode类的两个常用的构造方法是:DefaultMutableTreeNode(ObjectuserObject)创建的节点默认可以有子节点DefaultMutableTreeNode(ObjectuserObject,booleanallowChildren)add()添加其他节点作为它的子节点。setAllowsChildren(booleanb)方法设置是否允许有子节点。getUserObject()方法得到节点中存放的对象。JTree(TreeNoderoot)JTree的构造方法创建根节点是root的树。,2020/5/1,46,10.11树组件_2树上的TreeSelectionEvent事件,树组件可以触发TreeSelectionEve

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论