java 第11章 基于Swing的图形用户界面设计_第1页
java 第11章 基于Swing的图形用户界面设计_第2页
java 第11章 基于Swing的图形用户界面设计_第3页
java 第11章 基于Swing的图形用户界面设计_第4页
java 第11章 基于Swing的图形用户界面设计_第5页
已阅读5页,还剩137页未读 继续免费阅读

下载本文档

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

文档简介

基于Swing的图形用户界面设计1.AWT组件与SWING组件

2.JFrame窗体、布局设计

3.文本、按钮与标签组件、复选框与单选按钮

4.中间容器

5.列表组件、表格组件、树组件和进度条组件

6.窗口事件、鼠标事件、焦点事件和键盘事件

7.对话框、菜单组件11AWT组件与SWING组件概述Java早期进行用户界面设计时,使用java.awt包中提供的类。“AWT”就是AbstractWindowToolkit(抽象窗口工具包)的缩写。Java2(JDK1.2)推出之后,增加了一个新的javax.swing包,该包提供了功能更为强大的用来设计GUI界面的类。如果Java运行环境低于1.2版本,就不能运行含有SWING组件的程序。

2JComponent类的部分子类以及Jframe,JDialog类

3容器类(Container)和组件类(Component)4容器---可以容纳GUI部件(按某种布局)----窗体(JFrame)、面板(JPanel)组件---部署在容器中,实现某种交互。----文本框(JTextField)、按钮(JButton)、标签(JLabel)等容器类方法:add(),一个容器可以调用这个方法将组件添加到该容器中。removeAll():可以移掉容器中的全部组件,remove(Componentc):可以移掉容器中参数指定的组件。

validate()方法:每当容器添加新的组件或移掉组件时,应该让容器调用该方法,以保证容器中的组件能正确显示出来。容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。图形用户界面编程的一般步骤创建窗体(设置窗体大小、位置,让窗体可见)创建GUI(GraphicalUserInterface)组件(按钮,文本框,标签,列表等)将组件加入窗体这个容器布局设置,加入组件处理事件(比如单击按钮)JFrame窗体javax.swing.JFrame类是java.awt.Frame(窗体)类的子类当应用程序需要一个窗口时,可使用JFrame或其子类创建一个对象。窗口默认地被系统添加到显示器屏幕上。构造方法:JFrame()创建一个无标题的窗口。JFrame(Strings)创建一个标题为s的窗口。JFrame类常用方法:publicvoidsetBounds(inta,intb,intwidth,intheight)设置出现在屏幕上时的初始位置为(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。publicvoidsetSize(intwidth,intheight)设置窗口的大小,在屏幕出现默认位置是(0,0)。publicvoidsetVisible(booleanb)设置窗口是可见还是不可见,窗口默认是不可见的。publicvoidsetResizable(booleanb)设置窗口是否可调整大小,窗口默认是可调整大小的。JFrame类常用方法publicvoidsetDefaultCloseOperation(intoperation)该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。其中的参数operation取下列有效值:DO_NOTHING_ON_CLOSE什么也不做HIDE_ON_CLOSE隐藏当前窗口DISPOSE_ON_CLOSE隐藏当前窗口,并释放窗体占有的其他资源EXIT_ON_CLOSE结束窗体所在的应用程序这4个常量都是JFrame类中的static常量,单击关闭图标后,程序根据operation取值做出不同的处理。JFrameDemo01.java布局设计当把组件添加到容器中时,希望控制组件在容器中的位置,这就需要学习布局设计的知识。常见布局:

java.awt包中的FlowLayout、BorderLayout、CardLayout、GridLayout布局类;

java.swing.border包中的BoxLayout布局类。容器可以调用方法setLayout(布局对象);设置自己的布局。比如setLayout(newCardLayout());对于JFrame窗口,默认布局是BorderLayout布局。1.FlowLayout布局FlowLayout属于流式布局管理器,使用此种布局方式,所有组件会像流水一样依次进行排列。其常用构造方法如下:

publicFlowLayout()构造一个新的FlowLayout,它是居中对齐的,默认的水平和垂直间隙是5个单位。publicFlowLayout(int

align)构造一个新的FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是5个单位。align参数的值必须是以下值之一:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING或FlowLayout.TRAILING。publicFlowLayout(int

align,int

hgap,int

vgap)

创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。

10FlowLayout的常用方法publicvoidsetAlignment(int

align)设置布局的对齐方式。publicvoidsetHgap(int

hgap)设置组件之间以及组件与Container的边之间的水平间隙。publicvoidsetVgap(int

vgap)设置组件之间以及组件与Container的边之间的垂直间隙。publicintgetHgap()获取组件之间以及组件与Container的边之间的水平间隙。publicintgetVgap()获取组件之间以及组件与Container的边之间的垂直间隙。例:FlowLayoutDemo0111BorderLayout布局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);注:如果不指定区域,则默认加入到CENTER;添加到某个区域的组件将占据整个这个区域.每个区域只能放置一个组件,如果向某个已放置了组件的区域再放置一个组件,那么先前的组件将被后者替换。注:使用BorderLayout布局的容器最多能添加5个组件,如果组件超过5个,就必须使用容器的嵌套或改用其他布局策略。例BorderLayoutDemo01.java13CardLayout布局使用CardLayout容器可以容纳多个组件,但同一时刻容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上面的一张一样,这个被显示的组件将占据所有的容器空间。JTabbedPane(窗格,中间容器)的默认布局是CardLayout布局,并且自带一些选项卡,这些选项卡与用户添加到JTabbedPane窗格中的组件相对应,单击该选项卡,JTabbedPane窗格将显示对应的组件。选项卡窗格自带的选项卡默认地在该选项卡窗格的顶部,从左向右依次排列,选项卡的顺序和所对应的组件的顺序相同。使用JTabbedPane窗格的构造方法publicJTabbedPane(inttabPlacement)创建的选项卡窗格的选项卡的位置由参数tabPlacement指定,该参数的有效值为JTabbedPane.TOP、JTtabbedPane.BOTTOM、JTabbedPane.LEFT和JTabbedPane.RIGHT。JTabbedPane窗格可以使用add(Stringtext,Componentc);方法将组件c添加到JTabbedPane窗格中,并指定和组件c对应的选项卡的文本提示是text。例:CardLayoutDemo01,在选项卡窗格中添加了5个按钮(带有图标),并设置了相对应的选项卡的文本提示,然后将选项卡窗格添加到窗体的内容面板中(效果如图10.6所示)。1516GridLayout布局GridLayout是使用较多的布局编辑器,其基本布局策略是把容器划分成若干行若干列的网格区域,组件就位于这些划分出来的小格中。使用GridLayout布局编辑器的一般步骤如下:(1)使用GridLayout的构造方法GridLayout(intm,intn)创建布局对象,指定划分网格的行数m和列数n,如GridLayoutgrid=newGridLayout(10,8);(2)使用GridLayout布局的容器调用方法add()将组件加入容器,组件进入容器的顺序将按照第一行第一个、第一行第二个…第一行最后一个、第二行第一个…最后一行第一个…最后一行最后一个。例如GridLayoutDemo01:使用GridLayout布局的容器最多可添加m×n个组件。GridLayout布局中每个网格都是相同大小,并且强制组件与网格的大小相同。为了克服这个缺点,可以使用容器嵌套。例如,一个容器使用GridLayout布局,将容器分为三行一列的网格,那么可以把另一个容器添加到某个网格中;而添加的这个容器又可以设置为GridLayout布局、FlowLayout布局、CarderLayout布局或BorderLayout布局等。利用这种嵌套方法,可以设计出符合一定需要的布局.BoxLayout布局用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。

例BoxLayoutDemo01.java中(效果如图10.7所示),有两个列型盒式容器boxV1、boxV2和一个行型盒式容器baseBox。在列型盒式容器的组件之间添加垂直支撑,控制组件之间的距离,将boxV1、boxV2添加到baseBox中,并在它们之间添加水平支撑。21null布局可以把一个容器的布局设置为null布局(空布局)。setLayout(null)空布局容器可以准确地定位组件在容器的位置和大小。setBounds(inta,intb,intwidth,intheight)方法是所有组件都拥有的一个方法,组件调用该方法可以设置本身的大小和在容器中的绝对位置。空布局的容器添加组件步骤:1.

把容器p的布局设置为空布局p.setLayout(null);

2.向空布局的容器p添加一个组件c需要两个步骤。首先使用add(c)方法向容器添加组件,然后组件c再调用setBounds(inta,intb,intwidth,intheight)方法设置该组件在容器中的位置和本身的大小。组件都是一个矩形结构,方法中的参数a和b是被添加的组件c的左上角在容器中的位置坐标,即该组件距容器左面a个像素,距容器上方b个像素;weidth和height是组件c的宽和高。中间容器_JPanel面板JPanel面板可以使用JPanel创建一个面板,再向这个面板添加组件,然后把这个面板添加到底层容器或其他中间容器中。JPanel面板的默认布局是FlowLayout布局。JPanel类构造方法Jpanel()可以构造一个面板容器对象。JPanelDemo01中间容器_JScrollPaneJScrollPane滚动窗格可以把一个组件放到一个滚动窗格中,然后通过滚动条来观察这个组件。JScorollPane的构造方法JScorollPane(componentc)可以构造一个滚动窗格。JScrollPaneDemo01中间容器-JSplitPane拆分窗格拆分窗格有两种类型水平拆分和垂直拆分。水平拆分窗口用一条拆分线把容器分成左右两部分,左面放一个组件,右面放一个组件,拆分线可以水平移动。垂直拆分窗格由一条拆分线分成上下两部分,上面放一个组件,下面放一个组件,拆分线可以垂直移动。构造方法JSplitPane(inta,Componentb,Componentc)可以构造一个拆分窗格,参数a取JSplitPane的静态常量HORIZONTAL_SPLIT或VERTICAL_SPLIT,以决定是水平还是垂直拆分。后两个参数决定要放置的组件。拆分窗格调用setDividerLocation(doubleposition)设置拆分线的位置。JSplitPaneDemo01

文本组件--JTextFieldJTextField创建的一个对象就是一个文本框。用户可以在文本框输入单行的文本。

J构造方法:

JTextField(intx)

创建指定长度的单行文本框对象。

JTextField(Strings)

创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。27JTextField常用方法

publicvoidsetText(Strings)

设置文本框中的文本为参数s指定的文本,文本框中先前的文本将被清除。

publicStringgetText()

获取文本框中的文本。

publicvoidsetEditable(booleanb)

指定文本框的可编辑性。创建的文本框默认是可编辑的。

publicvoidsetHorizontalAlignment(intalignment)

设置文本在文本框中的对齐方式,alignment的有效值为JTextField.LEFT、JTextField.CENTER和JTextField.RIGHT。28文本组件-JPasswordField使用JTextField的子类JPasswordField可以建立一个密码框对象。publicvoidsetEchoChar(charc)设置回显字符(默认的回显字符是'*'),publicchar[]

getPassword()方法返回密码框中的密码。29文本组件--JTextAreaJTextArea类专门用来建立文本区,用户可以在文本区输入多行的文本.

JTextArea(introws,intcolumns)

构造一个可见行和可见列分别是rows和columns的文本区。

setLineWrap(booleanb)

决定输入的文本能否在文本区的右边界自动换行;

getText()获取文本setText(Strings)替换文本区的文本

append(Strings)

在尾加文本

insert(Strings,intx)

在文本区的指定位置处插入文本30JTextArea常用方法replaceRange(StringnewString,intstart,intend)

将文本区start至end处的文本替换为新文本newString

setCaretPosition(intposition)设置文本区中输入光标的置(position不能大于文本区中字符的个数)

copy()和cut()方法将文本区中选中的内容复制或剪切到系统的剪贴板

paste()

将系统剪贴板上的文本数据粘贴在文本区中。

setSelectionStart(intselectionStart)和

setSelectionEnd(intselectionEnd)设置选中的文本

select(intselectionStart,intselectionEnd)和

selectAll()选中部分或全部文本31

按钮与标签组件1.JButton按钮组件JButton类是专门用来建立按钮的,即JButton类创建的一个对象就是一个按钮。JButton类常用的构造方法如下:public

JButton(Stringtext)

创建名字是text的按钮。publicJButton(Iconicon)

创建带有图标icon的按钮。publicJButton(Stringtext,Iconicon)

创建名字是text且带有图标icon的按钮32JButton组件的常用方法◆publicvoidsetText(Stringtext)重新设置当前按钮的名字,名字由参数text指定。◆publicStringgetText()

获取当前按钮上的名字。◆publicvoidsetIcon(Iconicon)

重新设置当前按钮上的图标。◆publicIcongetIcon()

获取当前按钮上的图标◆publicvoidsetHorizontalTextPosition(inttextPosition)

设置按钮名字相对按钮上图标的水平位置。33

2.JLabel标签

JLabel类负责创建标签对象,标签用来显示信息。JLabel类的构造方法如下: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决定标签中的文字和图标作为一个整体在标签中的水平对齐方式(名字总是在图标的右面)。34JLabel类的常用方法

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。35事件与监听器如果要使一个图形界面变的有意义,就必须加入事件处理。当一个按钮按下时,在文本框中按回车键完成输入时,按钮和文本框内容的状态都会发生变化,此时就会产生一个事件,而如果要处理此事件,则需要事件的监听者不断的监听事件的变化,并根据这些事件进行响应的处理。在Swing编程中,依然使用了AWT的事件处理方式,所有的事件类(基本上任意的一个组件都有对应的事件)都是EventObject的子类。36ActionEvent事件在学习处理事件时,读者必须很好地掌握事件源、监视器、处理事件的接口这三个概念。JTextField、JPasswordField和JButton触发ActionEvent事件,通过处理文本框这个具体的组件上的事件,来掌握处理事件的基本原理。371)处理事件-----事件源事件源:能够产生事件的对象都可以称为事件源,如文本框、按钮、下拉式列表等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。事件:用户对事件源进行了某种操作,进而触发了指定的事件。比如单击按钮,在文本框中按回车键等。2)处理事件-----监视器监视器:我们需要一个对象对事件源进行监视,以便对发生的事件做出处理。AWT定义了各种类型的事件,每一种事件都有相应的事件监视者接口,在接口中描述了处理相应事件应实现的基本行为。若事件类名为XxxEvent,则事件监听接口的命名为XxxListener,给事件源注册监视器的方法为addXxxListener(XxxListenerlistener)AWT事件接口及处理方法描述信息接口名称方法(事件)点击按钮、点击菜单项、文本框按回车等动作ActionListeneractionPerformed(ActionEvent)选择了可选项的项目ItemListeneritemStateChanged(ItemEvent)文本部件内容改变TextListenertextValueChanged(TextEvent)移动了滚动条等部件AdjustmentListeneradjustmentVlaueChanged(AdjustmentEvent)鼠标移动MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)鼠标点击等MouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)以上接口和类均在java.awt.event的包中定义键盘输入KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)部件收到或失去焦点FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)部件移动、缩放、显示/隐藏等ComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)窗口事件WindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)容器增加/删除部件ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)当前版本:20045更新日期:2016.05.24查看详情:2)处理事件-----监视器事件源通过调用相应的方法将某个对象作为自己的监视器。例如,对于按钮,这个方法是:addActionListener(ActioListenerlistener)当单击了有监视器的按钮时,Java运行系统就自动用ActionEvent类创建了一个对象,即发生了ActionEvent事件。也就是说,事件源获得监视器之后,相应的操作就会导致事件的发生,并通知监视器,监视器就会做出相应的处理。3)处理事件-----接口ActionListener作为监听器,负责处理事件源发生的事件,但它本身是一个接口:publicinterfaceActionListenerextendsEventListener{voidactionPerformed(ActionEvente)//抽象方法,处理事件}3)处理事件-----接口ActionListener是接口,因此必须将一个实现了ActionListener接口的类创建的对象传递给addActionListener方法的参数,使得该对象成为事件源的监视器。创建监视器的类必须提供处理事件的特定方法,即实现接口中的actionPerformed(ActionEvente)方法。classTestimplementsActionListener{publicvoidactionPerformed(ActionEvente){//事件的处理过程}}Java采用接口回调技术来处理事件,当事件源发生事件时,接口立刻通知监视器自动调用实现的某个接口方法,接口方法规定了怎样处理事件的操作。接口回调这一过程对程序是不可见的,Java在设计组件事件时已经设置好了这一回调过程,程序只需让事件源获得正确的监视器,即将实现了正确接口的对象的引用传递给方法addActionListener(ActionListenerlistener)中的参数listener事件处理模式

事件处理模式如图10.9所示.46谁作为监听者合适?

(1)事件源对象的容器类作为监听者

btn1.addActionListener(this);importjava.awt.event.*;publicclassTestextendsJFrameimplementsActionListener{publicTest(){...

btn1.addActionListener(this);...}

publicvoidactionPerformed(ActionEvente){…}…}谁作为监听者合适?

(2)用内嵌类实现

btn1.addActionListener(newProcess());publicclassTestextendsJFrame{publicTest(){...

btn1.addActionListener(newProcess());....}

classProcessimplementsActionListener{publicvoidactionPerformed(ActionEvente){…}}}谁作为监听者合适?

(3)用匿名内嵌类实现

btn1.addActionListener(newActionListener();publicclassTestextendsJFrame{publicTest(){...

btn1.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){…}});...}…}ActionEvent类中的方法当多个事件源拥有同一个监视器时,在事件处理过程中需要区分事件源,可以采取的方法有:publicObjectgetSource()返回发生ActionEvent事件的对象的引用。publicStringgetActionCommand()获取发生ActionEvent事件时,和该事件相关的一个命令字符串对于文本框,当发生ActionEvent事件时,用户在文本框中输入的文本字符串就是和该事件相关的一个命令字符串。对于按钮,该命令字符串就是按钮上显示的字符

Esource.java50ActionEventDemo01中,窗口中有一个文本框text,text的事件监视器由PoliceStation类负责创建。当用户在text中输入字符串回车后,监视器负责在命令行输出该字符串以及它的长度(效果如图10.10所示)。

ActionEventDemo02中,titleText和passwordText有监视器。当在titleText中输入字符串回车后,监视器负责将窗体的标题更改为当前titleText中的文本。当在passwordText中输入密码回车后,监视器负责将密码显示在titleText中(效果如图10.11所示)。

ActionEventDemo03使用匿名对象作为inputText的监视器,当在inputText中输入一个数字字符串后,监视器负责计算这个数的平方,并将结果放入showText中(效果如图10.12所示)。51

例子10-8,9,10运行效果图10.10,10.11,10.1252事件适配器类Java中为那些含多个方法的监听者接口提供了事件适配器类,对应XxxListener接口,这个类命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法。比如:WindowListener接口中包含了7个抽象方法,对应的适配器类就是WindowAdapter,该类中以空方法的方式实现了相应接口的所有方法。程序员设计可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,即重写关心的方法。MyFrame.javaJTextArea的DucumentEvent事件

文本区可以触发DucumentEvent事件,DucumentEven类在javax.swing.event包中。用户在文本区组件的UI代表的视图中进行文本编辑操作,使得文本区中的文本内容发生变化,将导致该文本区所维护的文档模型中的数据发生变化,从而导致DucumentEvent事件的发生。文本区调用addDucumentListener(DucumentListenerlistener)向文本区维护的文档注册监视器。监视器需实现DucumentListener接口,该接口中有3个方法:publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)getDocument()返回维护的文档,该文档是实现了Document接口类的一个实例。

54例Example10_12中,有两个文本区和一个文本框。当用户在文本区inputText进行编辑操作时,文本区showText将显示第一个文本区中所有和指定模式匹配的字符串。用户可以事先在一个文本框patternText中输入指定的模式,比如,输入:[^\s\d\p{Punct}]+,即通过该模式获得文本区inputText中的全部单词,效果如图10.14所示。JCheckBox复选框复选框提供两种状态一种是选中,另一种是未选中,用户通过单击该组件切换状态。JCheckBox类构造方法:

publicJCheckBox()创建一个没有名字的复选框,初始状态是未选中。publicJCheckBox(Stringtext)创建一个名字是text的复选框,初始状态是未选中。publicJCheckBox(Iconicon)创建一个带有默认图标icon但没有名字的复选框,初始状态是未选中。publicJCheckBox(Stringtext,Iconicon)创建一个带有默认图标和名字text的复选框,初始状态是未选中。publicvoidsetIcon(IcondefaultIcon)设置复选框上的默认图标。56复选框常用方法publicvoidsetSelectedIcon(IconselectedIcon)

设置复选框选中状态下的图标。该方法可能经常被使用,因为如果不明显地设置选中状态时的图标,复选框无论是选中状态还是未选种状态总是显示复选框上的默认图标,用户很难知道复选框是处于怎样的状态。

publicbooleanisSelected()

如果复选框处于选中状态该方法返回true,否则返回false。如果复选框没有指定默认图标,复选框就显示为一个“小方框”,如果是选中状态,“小方框”里面就有个小对号。57复选框ItemEvent事件当复选框获得监视器之后,复选框从未选中状态变成选中状态或从选中状态变成未选中状态时就发生ItemEvent事件,ItemEvent类将自动创建一个事件对象。发生ItemEvent事件的事件源获得监视器的方法是addItemListener(ItemListenerlistener)处理ItemEvent事件的接口是ItemListener,创建监视器的类必须实现ItemListener接口,该接口中只有一个接口方法publicvoiditemStateChanged(ItemEvente),对发生的事件做出处理。58ItemEvent事件对象的方法publicObjectgetSource()获得产生事件的事件源。publicItemSelectablegetItemSelectable()返回事件的产生程序。注意:ItemSelectable是个接口。JCheckBox是该接口的实现类。59例Example10_14处理了复选框上的ItemEvent事件,当复选框被选中时,窗口中心显示一个带图标的标签,否则隐藏这个带图标的标签,效果如图10.16所示。60JRadioButton单选按钮一组单选按钮同一时刻只能有一个被选中。当创建了若干个单选按钮后,应使用ButtonGroup类再创建一个对象,然后利用这个对象把这若干个单选按钮归组。归到同一组的单选按钮每一时刻只能选一。单选按钮和复选框一样,也触发ItemEvent事件。

ButtonGroupfruit=newButtonGroup();JRadioButtonbutton1=newJRadioButton("小学"),button2=newJRadioButton("中学"),button3=newJRadioButton("大学");fruit.add(button1);fruit.add(button2);fruit.add(button3);61

列表组件用户可以在下拉列表看到第一个选项和它旁边的箭头按钮,当用户单击箭头按钮时,选项列表打开。下拉列表的常用方法如下:publicJComboBox()创建一个没有选项下拉列表。publicvoidaddItem(ObjectanObject)增加选项。publicintgetSelectedIndex()返回当前下拉列表中被选中的选项的索引,索引的起始值是0。publicObjectgetSelectedItem()返回当前下拉列表中被选中的选项。publicvoidremoveItemAt(intanIndex)从下拉列表的选项中删除索引值是anIndex的选项。publicvoidremoveAllItems()删除全部选项。publicvoidaddItemListener(ItemListener)向下拉列表增加ItemEvent事件的监视器。

62下拉式列表事件源可以发生ItemEvent事件。当下拉列表获得监视器后,用户在下拉列表的选项中选中某个选项时就发生ItemEvent事件,ItemEvent类将自动创建一个事件对象。

例Example10_15,列表的选项是Java源文件的名字。当选择一个选项后,程序在一个文本区里显示所选择的Java源文件的全部内容,效果如图10.17所示。63表格组件使用JTable可以创建一个表格对象。可以使用JTable的下列构造方法创建表格。JTable(Objectdata[][],ObjectcolumnName[])表格的视图将以行和列的形式显示数组data每个单元中对象的字符串表示,也就是说,表格视图中对应着data单元中对象的字符串表示。参数columnName用来指定表格的列名。用户在表格单元中输入的数据都被认为是一个Object对象,用户通过表格视图对表格单元中的数据进行编辑,以修改二维数组data中对应的数据,在表格视图中输入或修改数据后,需按回车键或用鼠标单击表格的单元格确定所输入或修改的结果。当表格需要刷新显示时,调用repaint()方法。64

例Example10_16是一个商品销售核算录入程序,客户通过一个表格视图的单元格输入每件商品的名称、单价和销售量。单击“每件商品销售额”按钮,表格视图每行的最后一个单元将显示该商品的总销售额;单击“总销售额”按钮,表格视图将计算最后一列值的和,同时表格增加一行,该行的最后一个单元显示总销售额,效果如图10.18所示。65树组件_1.树与节点JTree类的实例称为树组件。树组件也是常用的组件之一,它由节点构成。要想构造一个树组件,必须事先创建出称为节点的对象。任何实现MutableTreeNode接口的类创建的对象都可以成为树上的节点,树中最基本的对象是节点,它表示在给定层次结构中的数据项。树以垂直方式显示数据,每行显示一个节点。树中只有一个根节点,所有其他节点从这里引出。除根节点外,其他节点分为两类一类是带子节点的分支节点,另一类是不带子节点的叶节点。每一个节点关联着一个描述该节点的文本标签和图像图标。文本标签是节点中对象的字符串表示,图标指明该节点是否是叶节点。树组件的节点中可以存放对象,javax.swing.tree包提供的DefaultMutableTreeNode类是实现了MutableTreeNode接口的类,可以使用这个类创建树上的节点。66树组件的常用方法DefaultMutableTreeNode类的两个常用的构造方法是:DefaultMutableTreeNode(ObjectuserObject)创建的节点默认可以有子节点DefaultMutableTreeNode(ObjectuserObject,booleanallowChildren)add()添加其他节点作为它的子节点。setAllowsChildren(booleanb)方法

设置是否允许有子节点。getUserObject()方法得到节点中存放的对象。JTree(TreeNoderoot)JTree的构造方法创建根节点是root的树。TreeNode是接口67树组件_2.树上的TreeSelectionEvent事件

树组件可以触发TreeSelectionEvent事件,树使用addTreeSelectionListener(TreeSelectionListenerlistener)方法获得一个监视器。当用鼠标单击树上的节点时,系统将自动用TreeSelectionEvent类创建一个事件对象,通知树的监视器,监视器将自动调用TreeSelectionListener接口中的方法。创建监视器的类必须实现TreeSelectionListener接口,此接口中的方法是:publicvoidvalueChanged(TreeSelectionEvente)getLastSelectedPathComponent()树使用该方法获取选中的节点。

68例Example10_17,节点中存放的对象由Student类创建,当用户选中节点时,窗口中的文本区显示节点中存放的对象的有关信息,效果如图10.19所示。69进度条组件_1.JProgressBar类JProgressBar类可以创建进度条组件。该组件能用一种颜色动态地填充自己,以便显示某任务完成的百分比。三个常用的构造函数JProgessBar()、JProgressBar(intmin,intmax)和JProgressBar(intorient,intmin,intmax)。参数orient取值为JProgressBar.HORIZONTAL或JProgressBar.VERTICAL,决定进度条是水平填充还是垂直填充。

70进度条可调用方法pulicvoidsetsetValue(intn)进度条默认用一种颜色水平填充自己setMinimum(intmin)和setMaximum(intmax)可以改变最大和最小这两个值。setSize()

设置进度条大。进度条的最大值max是指将进度条平均分成max份。如果进度条的最小值是min,那么使用setValue(intn)方法时,n不能小于min。setStringPainted(booleana)

设置是否使用百分数或字符串来表示进度条的进度情况intgetValue()

获取进度值71例10-18(效果如图10.20所示)用进度条模拟显示线程的计算速度,一个线程用递归算法输出Fibinacci序列的前50项,另一个线程使用循环输出Fibinacci序列的前100项(Fibinacci序列的前两项是1,以后每项是前两项的和)。72进度条组件_2.带进度条的输入流我们最熟悉进度条的一种用法是读取文件时出现一个表示读取进度的进度条。这也是进度条的用武之地。如果读取文件时希望看见文件的读取进度,可以使用javax.swing包提供的输入流类ProgressMonitorInputStream。它的构造方法是:ProgressMonitorInputStream(Conmponentc,Strings,InputStream);它创建的输入流在读取文件时会弹出一个显示读取速度的进度条,进度条在参数c指定的组件的正前方显示,若该参数取null,则在屏幕的正前方显示。

73例Example10_19使用带进度条的输入流读取文件的内容,效果如图10.21所示。74组件的常见方法

JComponent类是所有组件的父类,本节介绍JComponent类的几个常用方法。组件都是矩形形状,组件本身有一个默认的坐标系,组件的左上角的坐标值是(0,0)。如果一个组件的宽是20,高是10,那么该坐标系中,x坐标的最大值是20,y坐标的最大值是10,如图10.22所示。75设置组件的颜色publicvoidsetBackground(Colorc)设置组件的背景色。

publicvoidsetForeground(Colorc)设置组件的前景色。

publicColorgetBackground()获取组件的背景色。

publicColorgetForeground()获取组件的前景色。上述方法中都涉及到Color类。Color类是java.awt包中的类,该类创建的对象称为颜色对象。publicColor(intred,intgreen,ingblue)Color类的构造方法,可以创建一个颜色对象,其中red、green、blue的取值在0~255之间。另外,Color类中还有red、blue、green、orange、cyan、yellow、pink等静态常量,都是颜色对象。76组件的常见方法_2.组件透明组件默认是不透明的。

publicvoidsetOpaque(booleanisOpaque)设置组件是否不透明,当参数isOpaque取false时组件被设置为透明,取true时组件被设置为不透明。

publicbooleanisOpaque()当组件不透明时该方法返回true,否则返回false。77组件的常见方法_3.组件的边框组件默认边框是一个黑边的矩形。publicvoidsetBorder(Borderborder)设置组件的边框。publicBordergetBorder()返回边框。组件调用setBorder()方法来设置边框,该方法的参数是一个接口,因此必须向该参数传递一个实现接口Border类的实例,如果传递一个null,组件将取消边框。可以使用BorderFactory类的类方法返回一个实现接口Border类的实例,如BorderFactory类的类方法createBevelBorder(inttype,Colorhighlight,Colorshadow)将会得到一个具有“斜角”的边框,参数type取值为BevelBorder.LOWERED或BevelBorder.RAISED。

78组件的字体publicvoidsetFont(Fontf)组件调用该方法设置组件上的字体。◆publicFontgetFont()组件调用该方法获取组件上的字体。◆java.awt包中的Font类创建的对象称为字体对象。Font类的构造方法是:

publicFont(Stringname,intstyle,intsize);创建字体对象其中name是字体的名字,如果系统不支持字体的名字,将取默认的名字创建字体对象。style决定字体的样式,是一个整数,有效取值是:Font.BOLD、Font.PLAIN、Font.ITALIC、Font.ROMAN_BASELINE、Font.CENTER_BASELINE、Font.HANGING_BASELINE或Font.TRUETYPE_FONT。◆79组件的字体◆GraphicsEnviroment类是java.awt包中的抽象类,不能用构造方法创建对象,Java运行环境准备好了这个对象,只需让GraphicsEnvironment类调用它的类方法获取这个对象的引用即可publicGraphicsEnvironmentstaticgetLocalGraphicsEnvironment()◆

String[]getAvailableFontFamilyNames()GraphicsEnvironment对象调用该方法获取计算机上所有可用的字体名称,并存放到字符串数组中。

例10-20中,下拉列表listFont中列出全部可用字体名字,在下拉列表listFont中选择字体名字后,文本区用相应的字体显示特定的文本“北京奥运”(效果如图10.23所示)。80

例子10-20运行效果图10.2381组件的大小与位置publicvoidsetSize(intwidth,intheight)设置组件的大小,参数width指定组件的宽度,height指定组件的高度。◆publicvoidsetLocation(intx,inty)设置组件在容器中的位置,包含该组件的容器都有默认的坐标系,容器的坐标系的左上角的坐标是(0,0),参数x和y指定该组件的左上角在容器的坐标系中的坐标,即组件距容器的左边界x个像素,距容器的上边界y个像素。◆publicDimensiongetSize()返回一个Dimension对象的引用,该对象实体中含有名字是width和height的成员变量,方法返回的Dimmension对象的width的值就是组件的宽度、height的值就是当前组件的高度。◆publicPointgetLocation(intx,inty)返回一个Point对象的引用,该对象实体中含有名字是x和y的成员变量,方法返回的Point对象x和y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标。◆82组件的大小与位置◆publicvoidsetBounds(intx,inty,intwidth,intheight)

设置组件在容器中的位置和组件的大小。该方法相当于setSize()方法和setLocation()方法的组合。◆publicRectanglegetBounds()

返回一个Rectangle对象的引用,该对象实体中含有名字是x、y、width和height的成员变量,方法返回的Rectangle对象x和y的值就是当前组件左上角在容器坐标系中的x坐标和y坐标,width和height的值就是当前组件的宽度和高度。83组件的激活与可见性

◆publicvoidsetEnabled(booleanb)

设置组件是否可被激活。当参数b取值true时,组件可以被激活,当参数b取值false时,组件不可激活。默认情况下,组件是可以被激活的。

◆publicvoidsetVisible(boolean)

设置组件在该容器中的可见性。当参数b取值true时,组件在容器中可见,当参数b取值false时,组件在容器中不可见。除了Window组件外,其他类型组件默认是可见的。84鼠标事件_1.鼠标事件的触发

组件是可以触发鼠标事件的事件源。怎样才能导致组件触发鼠标事件呢?用户的下列7种操作都可以使得组件触发鼠标事件:◆鼠标指针从组件之外进入。◆鼠标指针从组件内退出。◆鼠标指针停留在组件上时,按下鼠标。◆鼠标指针停留在组件上时,释放鼠标。◆鼠标指针停留在组件上时,单击鼠标。◆在组件上拖动鼠标指针。◆在组件上运动鼠标指针。鼠标事件的类型是MouseEvent,即组件触发鼠标事件时,MouseEvent类自动创建一个事件对象。85鼠标事件_2.MouseListener接口Java分别使用MouseListener接口与MouseMotionListener接口两个接口来处理鼠标事件。如果事件源使用addMouseListener(MouseListenerlistener)获取监视器,那么用户的下列5种操作可使得事件源触发鼠标事件:◆鼠标指针从组件之外进入。◆鼠标指针从组件内退出。◆鼠标指针停留在组件上面时,按下鼠标。◆鼠标指针停留在组件上面时,释放鼠标。◆鼠标指针停留在组件上面时,单击或连续单击鼠标。86MouseListener接口创建监视器的类必须实现MouseListener接口,该接口有5个方法:◆mousePressed(MouseEvent)负责处理鼠标按下触发的鼠标事件。◆mouseReleased(MouseEvente)负责处理鼠标释放触发的鼠标事件。◆mouseEntered(MouseEvente)负责处理鼠标进入组件触发的鼠标事件。◆mouseExited(MouseEvente)负责处理鼠标退出组件触发的鼠标事件。◆mouseClicked(MouseEvente)负责处理鼠标单击或连击触发的鼠标事件。.MouseMotionListener接口

Java分别使用MouseListener接口与MouseMotionListener接口两个接口来处理鼠标事件。如果事件源使用

addMouseMotionListener(MouseMotionListenerlistener)获取监视器,那么用户的下列两种操作可使得事件源触发鼠标事件:◆在组件上拖动鼠标指针。◆在组件上运动鼠标指针。88MouseMotionListener接口创建监视器的类必须实现MouseMotionListener接口,该接口有两个方法:◆mouseDragged(MouseEvente)负责处理鼠标拖动事件,即在事件源上拖动鼠标时,监视器将自动调用接口中的这个方法对事件做出处理。◆mouseMoved(MouseEvente)负责处理鼠标移动事件,即在事件源上运动鼠标时,监视器将自动调用接口中的这个方法对事件做出处理。由于处理鼠标事件的接口中的方法多于一个,Java提供了相应的适配器类,分别是MouseAdapter和MouseMotionAdapter,这两个类分别实现了MouseListener接口和MouseMotionListener接口。.MouseEvent类在处理鼠标事件时,程序经常关心鼠标在当前组件坐标系中的位置,以及触发鼠标事件使用的是鼠标的左键或右键等信息。MouseEvent类中有下列几个重要的方法:◆getX()返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的x坐标。◆getY()返回触发当前鼠标事件时,鼠标指针在事件源坐标系中的y坐标。◆getModifiers()返回一个整数值,如果是通过鼠标左键触发的鼠标事件,该方法返回的值等于InputEvent类中的类常量BUTTON1_MASK;如果是右键,返回的是InputEvent类中的类常量BUTTON3_MASK。◆getClickCount()返回鼠标被连续单击的次数。◆getSource()返回触发当前鼠标事件的事件源。

90例10-22使用MouseListener接口处理鼠标事件。在程序中,分别监视按钮、标签和窗体上的鼠标事件,当发生鼠标事件时,获取鼠标的坐标值,效果如图10.24所示。注意:事件源的坐标系的左上角是原点。鼠标事件_4.用鼠标拖动组件可以使用坐标变换来实现组件的拖动。当我们用鼠标拖动容器中的组件时,可以先获取鼠标指针在组件坐标系中的坐标x,y,以及组件的左上角在容器坐标系中的坐标a,b;如果在拖动组件时,想让鼠标指针的位置相对于拖动的组件保持静止,那么,组件左上角在容器坐标系中的位置应当是a+x-x0,a+y-y0,其中x0,y0是最初在组件上按下鼠标时,鼠标指针在组件坐标系中的位置坐标。

92例10-23中,窗体中添加了一个分层窗格,分层窗格中添加了一些组件。该例子使用MouseListener接口和MouseMotionListener接口处理鼠标事件,可以用鼠标拖动分层窗格中的组件,效果如图10.25所示。使用分层窗格是为了保证被拖动的组件不会被其他组件遮挡。弹出式菜单单击鼠标右键出现弹出式菜单是用户熟悉和常用的操作,这是通过处理鼠标事件实现的。弹出式菜单由JPopupMenu类负责创建,可以用下列构造方法创建弹出式菜单:◆publicJPopupMenu()构造无标题弹出式菜单。◆publicJPopupMenu(Stringlabel)构造由参数label指定标题的弹出式菜单。弹出式菜单需要在某个组件的正前方弹出可见,通过调用publicvoidshow(Componentinvoker,intx,inty)方法设置弹出式菜单在组件invoker上的弹出的位置,位置坐标(x,y)按invoker的坐标系。

94例10-24中,在文本区上单击右键时,在鼠标位置处弹出菜单,用户选择相应的菜单项可以将文本区中选中的内容复制、剪切到系统的剪贴板中或将剪贴板中的文本内容粘贴到文本区,效果如图10.26所示。焦点事件组件可以触发焦点事件。组件可以使用

publicvoidaddFocusListener(FocusListenerlistener)增加焦点事件监视器。当组件具有焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件。创建监视器的类必须实现FocusListener接口,该接口有两个方法:◆publicvoidfocusGained(FocusEvente)◆publicvoidfocusLost(FocusEvente)

当组件从无输入焦点变成有输入焦点触发FocusEvent事件时,监视器调用类实现的接口方法focusGained(FocusEvente);当组件从有输入焦点变成无输入焦点触发FocusEvent事件时,监视器调用类实现的接口方法focusLost(FocusEvente)。一个组件调用publicbooleanrequestFocusInWindow()方法可以获得输入焦点。

961.使用KeyListener接口处理键盘事件当一个组件处于激活状态时,组件可以成为触发KeyEvent事件的事件源。当某个组件处于激活状态时,如果用户敲击键盘上一个键就导致这个组件触发KeyEvent事件。组件使用addKeyListener()方法获得监视器。监视器是一个对象,创建该对象的类必须实现接口KeyListener。接口KeyListener中有3个方法:◆publicvoidkeyPressed(KeyEvente)◆publicvoidkeyTyped(KeyEvente)◆publicvoidKeyReleased(KeyEvente)。97当按下键盘上某个键时,监视器就会发现,然后方法keyPressed()会自动执行,并且KeyEvent类自动创建一个对象传递给方法keyPressed()中的参数e。方法keyTyped()是Pressedkey()和keyReleased()方法的组合。用KeyEvent类的publicintgetKeyCode()方法可以判断哪个键被按下、敲击或释

温馨提示

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

最新文档

评论

0/150

提交评论