第七章 Swing程序设计_第1页
第七章 Swing程序设计_第2页
第七章 Swing程序设计_第3页
第七章 Swing程序设计_第4页
第七章 Swing程序设计_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

第七章Swing程序设计主讲:王芳Java程序设计本章知识点javaSwing概述掌握常用窗体的使用掌握常用组件与布局的使用掌握常用面板掌握按钮、列表、文本组件掌握常用事件监听器7.1Swing概述Swing特点java的优势是网络应用方面,但java也提供了强大的用于开发桌面程序的API,这些API在javax.swing包中。通过图形用户界面(GraphicsUserInterface,GUI),用户和程序之间可以方便地进行交互。java的java.awt包,即java抽象工具包(AbstractWindowToolkit,AWT)提供了许多用来设计GUI的组件类。

java早期进行用户界面设计时,主要使用java.awt包提供的类,比如Button、TextField、List等。JDK1.2推出之后,增加了一个新的javax.swing包,该包提供了功能更为强大的设计GUI的类。java.awt和javax.swing包中的一部分类的层次关系的UML图如图7.1所示。ComponentContainerJComponentWindowJDialogJFrameDialogFrameJButtonJTextFieldJPanelJTableJTextArea图7.1component类的部分子类

掌握两个概念:容器类(Container)和组件类(Component)javax.swing包中Jcomponent类是java.awt包Container类的一个直接子类,是java.awt包中Component类的间接子类,学习GUI编程主要是学习掌握使用Component类的一些重要的子类。以下是GUI编程经常用到的基本知识点。java把Component类的子类或间接子类创建的对象称为一个组件。java把Container的子类或间接子类创建的对象称为一个容器。可以向容器中添加组件。Container类提供了一个public方法add(),一个容器可以调用这个方法将组件添加到该容器中。容器调用removeAll()方法可以移调容器中的全部组件,调用remove(Componentc)方法可以移调容器中参数为c指定的组件。容器本身也是一个组件,因此可以把一个容器添加到另一个容器中实现容器的嵌套。每当容器添加新的组件或移调组件时,要调用validate()方法,以保证容器中的组件能正常显示出来。顶层类介绍Component类包含paint、repaint方法,可以在屏幕上绘制组件大多数GUI组件直接或间接扩展ComponentContainer类容纳相关组件包括add方法,用来添加组件包括setLayout方法,这个方法可用来设置布局,以帮助Container对象对其中的组件进行定位和设置组件大小JComponent类——多数Swing组件的超类可抽换的外观和感觉,即可根据需求定制外观和感觉。快捷键(通过键盘直接访问GUI组件)一般的事件处理功能Swing的组件和容器层次通常将javax.swing包里的Swing组件归为三个层次最外层容器中间层容器原子组件(最内层)顶层容器Swing提供三个最外层容器的类JFrame实现单个主窗口JDialog实现一个二级窗口(对话框)JApplet在浏览器窗口中实现一个applet显示区域必须和操作系统打交道,所以都是重量级组件。从继承结构上来看,它们分别是从原来AWT组件的Frame、Dialog和Applet类继承而来。每个使用Swing组件的Java程序都必须至少有一个顶层容器,别的组件都必须放在这个顶层容器上才能显现出来。JFrame窗体(常用方法)JFame()创建一个无标题的窗口。JFame(Strings)创建标题为s的窗口。publicvoidserSize(intwidth,intheight)设置窗口的大小。publicvoidsetBounds(inta,intb,intwidth,intheight)设置窗口的初始位置是(a,b),距屏幕左面a个像素,距屏幕上方b个像素,窗口的宽是width,高是height.publicvoidsetVisible(booleanb)设置窗口是否可见,窗口默认是不可见的。7.2常用窗体publicvoidsetDefaultCloseOperation(intoperation)该方法用来设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。其中的参数operation取JFrame类中的下列int型static常量,程序根据参数operation取值做出不同的处理:

DO_NOTHING_ON_CLOSE(什么也不做),HIDE_ON_COLSE(隐藏当前窗口),DISPOSE_ON_COLSE(隐藏当前窗口,并释放窗体占有的其他资源),EXIT_ON_CLOSE(结束窗口所在的应用程序)。例swing1.java容器的主要作用和特点容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。三层容器结构示例

最外层容器(窗口JFram)中间层容器(JPanel)最内层原子组件JFrame类JFrame的继承结构java.lang.Object└java.awt.Component└java.awt.Container└java.awt.Window└java.awt.Frame└javax.swing.JFrameJFrame类JFrame类是顶层容器。JFrame类的重要方法如下:setTitle()——设置窗口中标题栏的文字。setSize()——设置窗口的大小。dispose()方法——关闭窗口,并回收该窗口的所有资源。setLocation()——设置组件的位置。setResizable()——设置用户是否可以改变框架大小。setIconImage()设置图示有关ToolkitToolkitkit=Toolkit.getDefaultToolkit();Imageicon=kit.getImage("icon.gif");JDialog窗体(常用方法)JDialog()创建一个无标题和父窗体的对话框。JDialog(Framef)创建一个指定父窗体的对话框,该窗体没有标题publicJDialog(Framef,booleanmodel)创建一个指定类型的对话框并指定父窗体,但该窗体没有指定标题。publicJDialog(Framef,Stringtitle)创建一个指定标题和父窗体的对话框。publicJDialog(Framef,Stringtitle,booleanmodel)创建一个指定标题、窗体和模式的对话框。例MyFrame.java

菜单条、菜单、菜单项是窗口常用的组件,菜单放在菜单条里,菜单项放在菜单里。菜单条

JComponent类的子类JMenubar负责创建菜单条,即JMenuBar的一个实例就是一个菜单条,JFrame类将一个菜单条放在窗口的方法:setJMenuBar(JMenuBarbar);该方法是将菜单条添加到窗口的顶端,需要注意的是,只能向窗口添加一个菜单条。7.2菜单条、菜单、菜单项菜单

JComponent的子类JMenu负责创建菜单,JMenu的一个实例就是一个菜单。菜单项JComponent的子类JMenuItem负责创建的菜单项,JMenuItem的一个实例就是一个菜单项。嵌入式菜单

JMenu是JMenuItem的子类,菜单本身也是一个菜单项,当把一个菜单看作菜单项添加到某个菜单时,成这样的菜单为子菜单。菜单Menu菜单Menu菜单的几部分,如上页ppt所示:JMenuBarJMenuJMenuItem代码演示增加一个File菜单,并且生成new/open/save/saveas/exit菜单项由学生生成一个新的菜单Help且此菜单下有一个About菜单项带图标的菜单菜单上的图标

为了使菜单项上有一个图标,可以使用图标类Icon声明一个图标,然后使用子类ImageIcon类创建一个图标,如:Iconicon=newImageIcon("a.gif");然后菜单项调用setIcon(Iconicon)方法将图标设置为icon。例WindowMenu.java层级菜单弹出式菜单弹出式菜单弹出式菜单必须绑定到某一JComponent上面Jcomponent.setComponentPopupMenu()方法学习备注中的代码菜单的响应给菜单项添加ActionListener即可newItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){ System.out.println("Menuitemnew...");}});菜单相关的快捷键JMenuItem.setAccelerator()Ctrl+s:KeyEvent.VK_S+InputEvent.CTRL_MASK学习备注中的代码7.3JPanel类是一种经常使用的轻量级中间容器。在默认状态下,除了背景色外它并不绘制任何东西。可以很容易的为它设置边框和绘制特性,我们可以把它设置为顶层容器contentPane。有效地利用JPanel可以使版面管理更为容易。可以使用布局管理器来规划它所容纳的组件的位置和大小可以通过setLayout方法来改变其布局;也可以在创建一个JPanel对象时就为它确定某种布局方式。在默认状态下panel使用FlowLayout布局,将各组件布局在一行。JPanel类常用方法7.4JButton类JButton是一个按钮工具。JButton对象除了可以拥有文本标签之外,还可以拥有一个图标,这个图标可以是用户自己绘制的图形,也可以是已经存在的.gif图像。JButton按钮不但可以拥有一个图标,而且可以拥有一个以上的图标,并根据Swing按钮所处状态的不同而自动变换不同的Swing按钮图标。程序编程步骤及其代码说明首先创建一个JFrame类最外层容器。然后创建一个JPanel类的中间容器panel然后创建原子组件Jbutton等,并将它们添加到中间容器上。然后将中间容器通过内容面板添加到最外层容器上。代码示例7.6JTextField/JTextAreaJTextField:文本域,用于文本输入,但只接受单行输入JTextArea:文本区,可以输入多行文本,下面会单独列出来讲一下具有共同的父亲,JTextComponent相关方法voidsetText(Stringt)StringgetText()voidsetEditable(booleanb)调用方式:JTextFieldtextField=newJTextField(“defaultinput”,20);//20指可以输入的最大列数,超过这个列数会滚动,系统并不一定非要遵守这个列规定JTextFieldtextField=newJTextField(20);7.7JLabel标签,没有边框,不能响应用户的点击构造方法:请查看API文档(可以指定文本和图标)可以在构造方法中指定对齐方式,可以使用SwingContants中的常量(通过登录界面演示效果)JPasswordField密码域,用户输入的字符以*号显示常用方法publicJPasswordFiled(Strings,intcolumns),如果不需要初始字符串可以设置s为nullvoidsetEchoChar(charecho)设置回显字符,0表示默认的回显字符*char[]getPassword()返回密码域,返回的不是字符串,因为字符串在堆在存储,等待垃圾回收器回收,不安全如需要更多的设置请查看API说明文档7.5布局管理将下级组件有秩序地摆在上一级容器中,可以选择:在程序中具体指定每个组件的位置。使用布局管理器。布局管理器使用方法是通过调用容器对象的setLayout()方法,并以某种布局管理器对象为参数。使用布局管理器可以更容易地进行布局,而且当改变窗口大小时,它还会自动更新版面来配合窗口的大小,不需要担心版面会因此混乱。在Java中有很多实现LayoutManager接口的布局管理器类,经常用到的有以下几个BorderLayoutFlowLayoutGridLayoutGridBagLayout下面分别介绍这几种布局管理器,其他布局管理器类的使用可以参见JDK帮助文档。BorderLayoutBorderLayout以将组件放置到五个区域:东、西、南、北、中。是JFrame的默认布局,先放入边缘组件,剩余空间由中间组件填充,当容器缩放时,边缘厚度不会改变,而中部组件会发生变化.添加组件时,通过BorderLayout.NORTH/SOUTH/WEST/EAST/CENTER指定位置BorderLayout布局示意图CenterNorthSouthWestEastFlowLayoutFlowLayout是JPanel默认使用的布局管理器,它只是简单地把组件放在一行,如果容器不是足够宽来容纳所有组件,就会自动开始新的一行,当容器缩放时各组件会根据空间自动调整位置。通过FlowLayoutDemo.java例中,演示了该布局管理器的使用方法和效果。GridLayout网络布局像电子数据表一样,按行列排序所有的组件,不过它的每个单元大小都是一样的,构造的时候制定行和列,如newGridLayout(5,4)代码编写计算器界面GridBagLayout(网格箱布局管理器)网格箱布局管理器以网格为基础,允许组件使用最适当的大小,既可以占多个网格,也可以只占网格的一部分。1.GridBagLayout的构造方法GridBagLayout()2.创建网格箱布局管理器setConstraints(Componentcomp,GridBagConstrainsconstrians)例GridBagLayout.javaCalculator.java登录窗口、注册窗口例子1、应该使用什么布局管理器2、准备如何构造界面3、界面不好看,如何进一步设置对齐方式,设置各组件之间的距离,这需要更高级的布局管理器4、自己用代码编写界面确实比较累也比较烦,如果有一种可视化开发工具,拉控件就好了.例Login.javaBoxLayoutTest.java7.8事件处理当一个按钮被点击时,就是产生了一个事件,那么事件应该被如何处理看一个例子,点击按钮时会改变颜色,代码见备注事件处理以上过程其实是一个著名的设计模式:观察者模式举一个天气显示牌例子(或者望风小偷的例子)主题(Subject):JButton观察者(observer):监听器推送的内容:Event什么叫注册、什么叫取消注册,对于Jbutton如何注册观察者是否明白上页ppt中的原理JButton监听器Event事件处理常见事件ActionEventFocusEventKeyEvent、MouseEvent、MouseWheelEventWindowEvent对应的监听器ActionListenerFocusListenerKeyListener、MouseListener、MouseMotionLisener、MouseWheelListenerWindowListener、WindowFoucsListener、WindowStateLisener虽然类很多,但名子很好记7.8.1事件处理模式1.事件源:能够产生事件的对象都可以成为事件源.2.监视器:事件源通过调用相应的方法将某个对象注册为自己的监视器。对于文本框,这个方法是:addActionListener(监视器);事件源注册监视器之后,相应的操作就会导致相应的事件的发生,并通知监视器,监视器就会作出相应的处理。

3.处理事件的接口:

监视器负责处理事件源发生的事件。监视器是一个对象,为了处理事件源发生的事件,监视器这个对象会自动调用一个方法来处理事件。Java规定:为了让监视器这个对象能对事件源发生的事件进行处理,创建该监视器对象的类必须声明实现相应的接口,那么当事件源发生事件时,监视器就自动调用被类重写的某个接口方法(如图9.7)。7.8.2ActionEvent事件1.ActionEvent事件源:

文本框、按纽、菜单项、密码框和单选按纽都可以触发ActionEvent事件,即都可以成为ActionEvent事件的事件源。2.注册监视器:能触发ActionEvent事件的组件使用

addActionListener(ActionListenerlisten)

将实现ActionListener接口的类的实例注册为事件源的监视器。3.ActionListener接口:

ActionListener接口在java.awt.event包中,该接口中只有一个方法:

publicvoidactionPerformed(ActinEvente)

事件源触发ActionEvent事件后,监视器将发现触发的ActionEvent事件,然后调用接口中的方法:actionPerformed(ActinEvente)对发生的事件作出处理。ActionEvent类事先创建的事件对象就会传递给该方法的参数e。

4.ActionEvent类中的方法:

publicObjectgetSource()

调用该方法可以获取发生ActionEvent事件的事件源对象的引用。publicStringgetActionCommand()

调用该方法可以获取发生ActionEvent事件时,和该事件相关的一个命令字符串。

例6(Example9_6.java,WindowActionEvent.java,ReaderListen.java)

处理文本框上触发的ActionEvent事件。在文本框text中输入字符串回车,监视器负责计算字符串的长度,并在命令行窗口显示字符串的长度。例子6程序运行效果如图9.8和9.9。7.8.3DocumentEvent事件1.DocumentEvent事件源:文本区所维护的文档能触发DocumentEvent事件2.注册监视器:能触发DocumentEven事件的事件源使用

addDucumentListener(DocumentListenerlisten)将实现DocumentListener接口的类的实例注册为事件源的监视器。

3.DocumentListener接口:

DocumentListener接口在javax.swing.event包中,该接口中有三个方法:

publicvoidchangedUpdate(DocumentEvente)publicvoidremoveUpdate(DocumentEvente)publicvoidinsertUpdate(DocumentEvente)事件源触发DucumentEvent事件后,监视器将发现触发的DocumentEvent事件,然后调用接口中的相应方法对发生的事件作出处理。例子9(Example9_9.java

,

WindowDocument.java

,

TextListener.java

,

HandleListener.java

)将用户在一个文本区输入的单词按字典序排序后放入另一个文本区.7.8.4ItemEvent事件1.ItemEvent事件源:选择框、下拉列表都可以触发ItemEvent事件。2.注册监视器:能触发ItemEvent事件的组件使用

addItemListener(ItemListenerlisten)将实现ItemListener接口的类的实例注册为事件源的监视器。3.ItemListener接口:

ItemListener接口在java.awt.event包中,该接口中只有一个方法:publicvoiditemStateChanged(ItemEvente)事件源触发ItemEvent事件后,监视器将发现触发的ItemEvent事件,然后调用接口中的itemStateChanged(ItemEvente)方法对发生的事件作出处理。ItemEvent类事先创建的事件对象就会传递给该方法的参数e。4.ItemEvent类中的方法:

getSource()方法返回发生Itemevent事件的事件源外

getItemSelectable()方法返回发生Itemevent事件的事件源。7.8.5MouseEvent事件_1

任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发鼠标事件,即导致MouseEvent类自动创建一个事件对象。

1.使用MouseListener接口可以处理以下5种操作触发的鼠标事件在事件源上按下鼠标键、在事件源上释放鼠标键、在事件源上击鼠标键、鼠标进入事件源、鼠标退出事件源。▶MouseEvent中有下列几个重要的方法:getX()

获取鼠标指针在事件源坐标系中的x-坐标。getY()

获取鼠标指针在事件源坐标系中的y-坐标。getModifiers()

获取鼠标的左键或右键。getClickCount()

获取鼠标被单击的次数。getSource()

获取发生鼠标事件的事件源。

▶事件源注册监视器的方法是addMouseListener(MouseListenerlistener)。

▶MouseListener接口中有如下方法:

mousePressed(MouseEvent)

负责处理在组件上按下鼠标键触发的鼠标事件mouseReleased(MouseEvent)

负责处理在组件上释放鼠标键触发的鼠标事件mouseEntered(MouseEvent)

负责处理鼠标进入组件触发的鼠标事件mouseExited(MouseEvent)

负责处理鼠标离开组件触发的鼠标事件mouseClicked(MouseEvent)

负责处理在组件上单击鼠标键触发的鼠标事件7.8.5MouseEvent事件_1

例子10Example9_10WindowMouse.javaMousePolice.java分别监视按钮、文本框和窗口上的鼠标事件,当发生鼠标事件时,获取鼠标指针的坐标值,注意,事件源的坐标系的左上角是原点。

7.8.5MouseEvent事件_32.使用MouseMotionListener接口可以处理以下两种操作触发的鼠标事件,在事件源上拖动鼠标、在事件源上移动鼠标。▶事件源注册监视器的方法是

addMouseMotionListener(MouseMotionListenerlistener)▶

MouseMotionListener接口中有如下方法:mouseDragged(MouseEvent)

负责处理拖动鼠标触发的鼠标事件。mouseMoved(MouseEvent)

负责处理移动鼠标触发的鼠标事件。例子11

Example9_11.java

,WindowMove.java,LP.java

使用坐标变换来实现组件的拖动

7.8.6焦点事件

1.焦点事件源:组件可以触发焦点事件。

2.注册监视器:组件可以使用addFocusListener(FocusListenerlistener)注册焦点事件监视器。

3.FocusListener接口:创建监视器的类必须要实现FocusListener接口,该接口有两个方法:publicvoidfocusGained(FocusEvente)publicvoidfocusLost(FocusEvente)

当发生FocusEvent事件时,监视器调用类实现的接口中的相应方法。4.组件也可调用

publicbooleanrequestFocusInWindow()

方法可以获得输入焦点。

7.8.7键盘事件当一个组件处于激活状态时,敲击键盘上一个键就导致这个组件触发键盘事件。1.某个组件使用addKeyListener方法注册监视器。2.接口KeyListener中有如下方法:

publicvoidkeyPressed(KeyEvente)publicvoidkeyTyped(KeyEvente)publicvoidKeyReleased(KeyEvente)

3.相关方法:

publicintgetKeyCode()判断哪个键被按下、敲击或释放,返回一个键码值。

getKeyChar()判断哪个键被按下、敲击或释放,返回键上的字符。例子12

Example9_12.java

Win.java

Police.java通过处理键盘事件来实现软件序列号的输入。7.8.8窗口事件

JFrame及子类创建的窗口可以调用

setDefaultCloseOperation(intoperation);方法设置窗口的关闭方式(如前面各个例子所示).但是setDefaultCloseOperation方式可能不能满足程序的需要,比如,用户单击窗口上的关闭图标时,可能程序需要提示用户是否需要保存窗口中的有关数据到磁盘等.WindowListener接口.

(1)publicvoidwindowActivated(WindowEvente)当窗口从非激活状态到激活时,窗口的监视器调用该方法。(2)publicvoidwindowDeactivated(WindowEvente)当窗口激活状态到非激活状态时,窗口的监视器调用该方法。(3)publicvoidwindowClosing(WindowEvente)当窗口正在被关闭时,窗口的监视器调用该方法。(4)publicvoidwindowClosed(WindowEvente)当窗口关闭后,窗口的监视器调用该方法。(5)publicvoidwindowIconified(WindowEvente)当窗口图标化时,窗口的监视器调用该方法。(6)publicvoidwindowDeiconified(WindowEvente)当窗口撤消图标化时,窗口的监视器调用该方法。(7)publicvoidwindowOpened(WindowEvente)当窗口打开时,窗口的监视器调用该方法。练习在登录界面,如果用户密码错误,你应该如何提示?如何安装监听器??事件监听器内部类的不同使用方式Jbutton.addActionListener(newActionListener(){});形式classMyPanelimplementsAcionListener形式适配器的概念(adapter)用WindowListener来说明常见适配器FocusAdapter/KeyAdpater/MouseAdpater/MouseMotionAdapter/WindowAdapterJTextArea输入多行文本构造方法newJTextArea(8,40)//8行40列设置自动换行setLineWrap(true)如果行数太多增加滚动功能 textArea=newJTextArea(8,40); JScrollPanescrollPane=newJScrollPane(textArea);通过备注中的代码学习JTextArea复选框JCheckBox重要方法bold=newJCheckBox(“Bold”);bold.setSelected(true)isSelected()通过备注中程序学习单选按钮JRadioButtonJRadioButtonsmall=newJRadioButton(“small”,false);必须要放在一个RadioGroup里(见代码)备注中的代码描述了JRadioButton用法边界Border凸斜面/凹斜面/蚀刻/直线等通过BorderFactory中的静态方法生成上述BorderJcomponent.setBorder()方法给组件添加border下拉列表JComboBox通过备注中代码学习对话框模式和无模式:模式对话框在关闭之前不允许用户操作本程序的其它界面简单对话框介绍JOptionPane的四个方法:showMessageDialog(提示一个消息)showConfirmDialog(OK/No/Cancel)showOptionDialog(有几个选项让你选择)

温馨提示

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

评论

0/150

提交评论