图形用户界面程序设计

上传人:小** 文档编号:46438563 上传时间:2021-12-13 格式:DOC 页数:15 大小:363.50KB
返回 下载 相关 举报
图形用户界面程序设计_第1页
第1页 / 共15页
图形用户界面程序设计_第2页
第2页 / 共15页
图形用户界面程序设计_第3页
第3页 / 共15页
点击查看更多>>
资源描述
图形用户界面程序设计9.1 进入 Java GUI 编程世界为了使读者对Java GUI程序设计有一个比较全面的了解,本节先简要介绍一下 Java GUI程序设计的发展历程及 Java GUI 程序设计中的几个基本概念。9.1.1 AWT 与 Swing 介绍1. AWT在Java语言出现以前,各种操作系统平台如Windows、Linux、Solaris等有其专有的图形用户界面。 Java 语言为了达到独立于平台的目的, 最初设计了一种名叫 AWT 的 GUI 程序 开发类库, AWT (Abstract Window Toolkit) 是指抽象窗口工具包, 在 AWT 中提供了建立 GUI 程序的工具集,它主要包括基本的 GUI 程序组件,如按钮、标签、菜单、颜色、字体类、 布局管理器等,另外还提供了事件处理机制及图像操作等功能。AWT 可用于 Java 的 Applet 程序和 Application 程序中。 AWT 提供的组件都在位于 java.awt 包中。AWT 只是一组通用的无关于特定平台类。在具体某一平台上使用AWT 组件时 (如Button,即按钮),由运行时系统调用本地代码(native code)来实现该组件。例如,如果在Windows 平台中运行的一个 Java GUI 程序中使用了一个按钮组件,则运行时系统会调用 Windows 中实现按钮的代码显示一个 Windows 风格的按钮,而同样的代码在 Solaris 平台中 运行时,系统会调用 Solaris 中实现按钮的代码显示一个 Motif(Solaris 中窗口风格的名称 )风 格的按钮。这就会出现在 Java 中相同名称的组件,由于不同平台上本地实现的不同,而产 生不同的外观效果。因此, AWT 组件要在不同的平台上给用户提供一个一致的外观效果就 遇到了困难。也正是因为 AWT 所提供的窗口组件,并非由 AWT 完全真实的实现了这些组 件工具,因此才将 AWT称为抽象的(abstract)窗口工具。AWT的设计思想可以使 Java语言系统的设计人员很快实现在不同平台下的GUI组件,但缺点随操作系统平台的不同会显示出不同的样子。另外,AWT 中的组件比较呆板,如按钮 Button ,只能是一个方框中显示按钮的名称这种样子, 而无法改变。 为此, 在 Java 2以后, SUN 公司开发出了一种功能更为强大的名叫 Swing 组件。2. SwingSwing 组件与 AWT 组件相比有如下特点:Swing 组件完全用 Java 语言编写。Swing 组件的实现没有使用本地代码。Swing 组件的外观灵活多样, 如按钮可以显示图形, 形状除了矩形外还可以是圆形 或其他形状的按钮。Swing 提供的组件比 AWT 更丰富,如 Swing 提供 AWT 中所没有导航、打印等功 能。但是读者要注意,Swing并不是为了完全替代 AWT,而是对AWT的扩展,因为Swing 中的组件继承自AWT ,Swing中的版面布局管理和事件处理使用的还是AWT中定义的内容。一般将 AWT 组件称为重量级组件, 而将 Swing 中不依赖于本地 GUI 资源的组件称为轻量级 组件。Swing 组件位于 javax.swing 包中,该包中定义 250多个类,其中的组件类近 50 个(以 J开头)javax表示java extension是缩写,因此对Java的所有扩展功能都放在 javax中,Swing 就是其中之一。3. 组成GUI程序的组件简介在Java GUI程序设计中,一个程序通常由以下4个基本部分组成:(1)基本组件基本组件是构成 GUI程序的按钮(Button)、标签(Label)、文本框(TextField)、选择框(Choice) 等。基本组件都是抽象类Component的子类,而 Component类又继承 Object类,如图9-1所示。I TextAreajava.apple包TextComponent 一ButtonTextFieldAppletcontext重量级组件CanvasAppletStubObjectEventobjectFontFontMetricsColorGraphicsCheckBoxChoiceLabelListScrollbarjavax.swing 包AudioClipPanelAppletWindowFrameJAppletJWindowJFrameRootPaneContainerDialogJDialogGraphics 2DFileDialogComponent 1ContainerScrollpane:Menucomponent 厂MenuBart JComponent F T !MenuMenuItemCheckboxMenuItemLayoutManager2LayoutManagerGridLayout轻量级组件FlowLayout:表示类CardLayout:表示抽象类BorderLayoutGridBaglayout:表示接口图9-1 AWT类层次结构图(2) 容器类组件一个GUI程序中的基本组件,通常要放在一个容纳这些基本组件的容器中,所以把在 AWT中专门容纳其他组件的一些特定组件叫容器(Co ntai ner),容器的基类是 Con tai ner类,Con tai ner类是Compo nent的子类。如图 9-1所示。(3) 布局管理类一个容器中的组件,按照什么样的方式排列(即容器中的组件如何摆放),由AWT中的布局管理类组件负责。布局管理类组件也叫布局管理器。布局管理器类在图 9-1的左下方, 布局管理器类实现了LayoutManager接口或LayoutManager2接口。(4)事件处理类当用户按下 GUI程序中的一个按钮时,程序中就要对该“事件”进行处理,如按下一 个“保存”按钮时,要进行文件的存盘操作。 AWT中定义的事件类 AWTEvent是EventObject 类的子类,而EventObject类继承了 Object类。图9-2是Swing中主要类的层次结构图。由于Swing中的JApplet、JWindow、JFrame和JDialog等类直接继承了 AWT中的相关类,所以 Swing中的这几个类在图 9-1中。从图 9-2中可以看出 AWT中的基本组件,在 Swing中用相应的组件来代替,如AWT的Button组件,在Swing中相应的组件为 JButton。Swing组件类的名称前都加了“ J”这个字母,以 示与AWT组件的区别。JLayeredPane :I_ JPopupMenuJMenuBarJloolBarJLabelRootPane ContainerJComponentJInternalFrameJToolTip JMenultemAbstractButtonJButton,_ JloggleButton LJJCheckBoxMenultemJMenuJRadioButtonMenultemJCheckBoxJRadioButton:java.swing.text.jJTextComponenfJEditorpane L,_JlextFieldJTextPaneJPasswordFieldJTextAreaJSeparator- |JPopupmenu.SeperatorJProgressBar |JSliderJPanel | JTabbedPaneJSplitPan可 | JDeskTopPanp | JOptionPaneJScrollBarJScrollPaneJViewPortJFileChooserj JTree | | JColorChooser| -JComboBoxJTableJList图9-2 Swing类层次结构图在这里给出 AWT和Swing组件层次结构图的主要目的是让读者对组件(components)、容器(containers)、布局管理器(LayoutManager)之间的关系、以及 AWT组件与Swing组 件之间的关系有一个初步了解,因为学习GUI程序设计理解类之间的继承关系非常重要。AWT及Swing就好像一大片树林,其中有各种资源,而其间又有许多是互动的关系。 我们需要了解这片树林到底有哪些可用资源,这些资源放在哪里,它们之间的关系是怎么样的,这样才不会见树不见林,得心应手的设计Java GUI程序。下面介绍一个简单 Java GUI程序,通过该程序使读者先对Swing程序有一个直观的印象。9.1.2【案例9-1】文本转换器程序1. 案例描述设计一个GUI程序,在一个文本框中输入一行英文,单击转换按钮后可以将文本框中输入的内容转换为大写字母后显示出来。2. 案例效果图9-3(a)所示的窗口是案例程序在执行后的效果,图9-3(b)所示的窗口是输入文本内容后转换的结果。(a)(b)图9-3案例9-1的显示效果3. 技术分析该GUI程序也由前面介绍有4个部分组成:基本组件:组成该 GUI程序的基本组件有:一个按钮(JButton)、两个标签(JLabel)和一个文本框(JTextField)。一个标签用于显示提示信息,另一个标签用于显示转换 后的结果,文本框用于输入要转换的文本内容,按钮用于发出转换命令。容器:上述基本组件可以放在一个名叫JFrame的容器中,该窗口一般作为应用程序的框架窗口。布局管理:放置基本组件的容器可以使用一个名叫GridLayout布局管理类管理。事件处理:该程序中要完成将输入的文本内容轮换为大写后显示的功能,因此事件处理程序中首先要取得在文本框中输入的内容,这可以使用文本框(JTextField)定义的getText方法。对取得的字符串可以使用String类定义的toUpperCase方法转换为大写,然后使用标签类(JLabel)定义的setText方法,将转换后的内容设置为标签要 显示的内容。4. 程序解析下面是该案例的程序代码:0304050607080910111213141516171819202122232425262728293031323334353637383940414243444502 /案例 :9.1/ 程序名: toUpperCase.java/功能 :转换器程序,将句子中小写字母转换为大写字母 /*import java.awt.*;import javax.swing.*;import java.awt.event.*;public class toUpperCase public static void main(String args) /创建一个框架作为顶层容器JFrame frm = new JFrame( 文本转换器程序 );/ 取得 frm 中放置内容的面板Container contentPane = frm.getContentPane();/ 设置 frm 的布局管理 contentPane.setLayout(new GridLayout(4,1);/创建基本组件final JLabel label1 = new JLabel( 请在下面的文本框中输入要转换的内容: ); final JLabel label2 = new JLabel();JButton button = new JButton( 显示转换后的文本内容 );final JTextField textField = new JTextField(40);/将基本组件添加到内容面板contentPane.add(label1); contentPane.add(textField);contentPane.add(label2);contentPane.add(button);/ 设置 frm 的大小 frm.setSize(300,200);/ 设置 frm 的可见性frm.setVisible(true);/ 设置 frm 的关闭功能 frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/给按钮添加事件处理功能button.addActionListener(new ActionListener()public void actionPerformed(ActionEvent enent) /获取输入的文本内容 String inf = textField.getText(); /设置标签显示的文本内容46label2.setText(”您输入的文本转换成大写后是:+inf.toUpperCase();47 48 );49 50 尽管该程序中有比较详细的注释,但读者在阅读这些代码时可能还是不太理解,本案例的主要目的是让读者对 Java GUI程序的基本架构有一个初步的了解,至于程序中所涉及到 的基本组件、容器、布局管理和事件处理等知识在以后的内容中要进行详细的分析。通过该程序,我们可以大致到 GUI程序的组成总结如下:引入相关的包:案例 9-1中的07、08和09行引入的3个包在一般的Swing程序设 计中都要引入。设置顶层容器:顶层容器常用JFrame。创建基本组件:如按钮和标签等。将基本组件添加到容器中:一般使用容器类定义的add方法完成添加。如案例9-1中的27到30行。给组件添加事件处理功能:如案例9-1中的40行。编写事件处理程序:如案例9-1中的41到48行。9.1.3【相关知识】组件类的层次结构与Swing程序结构简介使用Swing进行GUI程序设计时,一般可按照如下的流程进行:1. 组件类的层次结构与分类大多数Swing组件的继承层次结构如下:java.la ng.ObjectL java.awt.Comp onentL java.awt.C ontainerL javax.swi ng.JComp onentCompo nent类是所的组件的顶层类,Con tai ner类是AWT中容器类的顶层类 (该类下一节介绍),其子类JComponent是Swing组件的顶层类。在这些顶层类中定义了大多数组件 可以使用常用操作。如在Component类中定义了在第 8章Applet程序中所使用过的paint等方法;如在 Con tai ner类中定义了本章案例 9-1中所用的给容器添加组件的add和设置容器布局管理的setLayout等方法。Swing组件从功能上分可分为:顶层容器、中间层容器和基本组件。2. Comp onent 类Java图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。Java语言中的GUI组件不能独立地显示出来,必须将组件放在一个容器中才可以显示出来。java.awt.Component类是所有AWT组件的顶层抽象类,其他组件类(包括Swing组件,容器也算是一种组件)都直接或间接的继承了该类。在这个类中定义了许多组件共用的属性 及大量的方法(如设置或获取图形组件对象的大小、显示位置、前景色和背景色、边界、可 见性等),因此许多组件类也就继承了Component类的成员方法和成员变量。Component类里面所定义的东西太多,我们无法在此一一列举,读者在使用过程应该经常查看JDK帮助文件。表9-1列举了一些最常用到的属性及方法。表9-1 Component类的常用属性与方法属性设置/取得的方法说明位置void setLocation(Point) void setLocation(int, int) Point getLocation() Point getLocationOnScreen()Point是java.awt中定义的点类。getLocation()方法获得组件的位置,该位置是相对于父 级组件坐标空间左上角的一个点。getLocationOnScreen()方法获得组件的位置,形式是一 个指定屏幕坐标空间中组件左上角的一个点。边界void setBounds(Rectangle) void setBounds(int,int,int,int) Rectangle getBounds()Rectangle是java.awt中定义的矩形类。背景颜色void setBackground(Color)Color getBackground()Color是java.awt中定义的颜色类,见第 8章介绍。前景颜色void setForeground(Color)Color getForeground()字体void setFont(Font)Font getFont()Font是java.awt中定义的字体类,见第 8章介绍。名称void setName(String name)StringgetName(Stringname)设置于获取组件的名称。3. JComp onent 类JComponent是一个抽象类,用于定义Swing中一些基本子类组件可用的方法。但并不是所有的 Swing 组件都继承于 JComponent 类(如 JFrame、JApplet、JDialog 和 JWindow 类 就不是该类的子类,见图 9-1),JComp on e nt类继承于Con tai ner类,所以凡是此类的组件都 可作为容器使用,这也是 Swing组件对AWT组件的一个最重要的改进。JComponent类的增加的功能主要有:边框设置:使用 setBorder()方法可以设置组件外围的边框,使用一个EmptyBorder对象能在组件周围留出空白。提示信息:使用setTooltipText()方法,为组件设置对用户有帮助的提示信息。设置应用程序的外观风格(Look and Feel):用UlManager.setLookAndFeel()方法可以设置用户所喜欢的外观风格(有metal、wi ndows、motif、mac这几种)。设置组件布局:通过设置组件最大、最小、推荐尺寸的方法能指定布局管理器的约 束条件,为布局提供支持。支持组件的打印功能。JComponent类为Swing组件增加了很多实用的功能,读者可以查看JDK帮助。4. 顶层容器顶层容器有JFrame、JApplet、JDialog和JWindow共4个,这4个顶层容器都是属于重 量级组件(Swing中只有这4个是属重量级组件),程序运行时要使用当地的GUI资源(见图9-1右边部分)。要设计一个 GUI应用程序,该程序中一般至少要包含一个顶层容器,因为每一个GUI组件(如JButton等)都需放入一个顶层容器中。5. 中间层容器虽然说每一个 Swing组件都是一种容器,但其样式与所能承装的内容却有所分别。有 些Swing组件是被设计专门来盛装别的组件用的,作为一种容器,好让被承装的组件能合 适地、有组织地被显示出来。这些只作为容纳别的组件的容器,是介于顶层容器与一般 Swing组件之间的,所以叫中间层容器。中间层容器有JMenuBar 、 JOptionPane、 JRootPane、JLayeredPane、 JPanel、JInternalFrame 、 JScrollPane、 JSplitPane、 JTabbedPane、 JToolBar 、 JDeskTopPane、 JViewPort 、 JEditorPane、 JTextPane。6. 基本组件基本组件是在 GUI 窗口中用来实现与用户交互的组件,如 Jbutton、JComboBox 、JList 、JMenu、 JSlider 、 JtextField 等。9.2 创建应用程序窗口 应用程序窗口一般是一个容器类对象,容器是一种特殊的 GUI 组件,用来容纳、组织 其他组件。本节介绍 Swing 中创建应用程序窗口和对话框的方法。9.2.1 创建应用程序窗口的方法1. 创建应用程序窗口( JFrame)在 Java GUI 应用程序设计, 要以一个顶层容器作为程序的窗口来容纳其他的 GUI 组件。 在容器类中, JFrame 类就是专门用作应用程序窗口的一个类,因此它也被称作程序应用框 架窗口。设计一个 GUI 程序,先要在程序中创建一个 JFrame 对象,以该对象作为程序的框 架窗口,然后在框架窗口中放入其他组件。JFrame窗口有标题栏,通过鼠标可以自由拖动并放置,在JFrame窗口的右上角有最小化、最大化和关闭按钮。(1) JFrame 类的层次结构JFrame容器类的继承层次结构如下:java.lang.ObjectL java.awt.Comp onentL java.awt.C ontainerL javax.awt.WindowL javax.awt.FrameL javax.swing.JFrame顶层容器类 JFrame 间接的继承了 Container 类, Container 类是所有容器类的父类,该 类中定义了容器所要用到的属性及方法,其中最常用的三个方法是:add(Component omp) :将一个组件添加到一个容器中。 setLayout(LayoutManager mgr) :设置容器的布局管理器。remove(Component omp) :从此容器中移去指定组件。从以上方法可以看出, 任何容器中都可以添加组件, 也可以设置一个容器的布局管理器, 或从一个容器中将一个组件移动。 由于 JFrame 间接的继承了 Container 类,因此它也可以使 用 Container 类定义的方法。(2) 创建一个框架窗口创建 JFrame 时,常用的构造方法是 :JFrame():新建一个框架窗口,在默认状态下,创建后的框架窗口是不可见的(即 在创建一个框架窗口后,并不会立即将其显示在屏幕上) 。JFrame(String title) :创建一个新的、初始不可见的、具有指定标题的框架窗口。( 3)框架窗口可以进行的操作JFrame除了可以使用表 9-1所示的方法外,其他常用的操作方法有:setVisible(boolean b):由于默认情况下新建的JFrame窗口是不可见的,因此要使用 setVisible(true) 方法将窗口设置为可见状态,可以显示在屏幕上。setTitle(String title) :设置框架窗口的标题。setSize(int width, int height) :设置框架窗口的大小。 setIconImage(Image image) :设置框架窗口要显示在最小化图标中的图像。pack():调整此窗口的大小,以适合其子组件的显示。 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) :在默认状态时,框架窗口右 上角的关闭按钮是不能正常关闭窗口的, 使用该方法后, 单击关闭按钮时, 应用程 序正常退出。注意:JFrame提供了大量的方法,在使用过程可以查看Java API文档。( 4)给框架窗口添加组件 在创建好一个框架窗口后,如何向框架窗口中添加组件呢?Swing 组件不能直接添加到一个框架窗口中, 而要添加到一个包含在框架窗口内的内容 面板(content pane)中。内容面板是框架窗口这种顶层容器包含的一个普通容器,当我们 要给框架窗口添加组件时,只能添加到内容面板,具体操作过程是:用getContentPane()方法获得JFrame的内容面板。如案例 9-1的第16行。用add()方法将组件添加到内容面板。如案例9-1的第27行到30行。向JFrame容器中添加组件的另一种方法是, 先建立一个JPanel之类面板(即中间容器), 再将创建好的其他组件添加到 JPanel面板中,然后用 setContentPane()方法将JPanel面板设 置为JFrame的内容面板。具体操作过程如下:JFrame frame = new JFrame();Jpanel contentPane = new Jpanel( );contentPane.add(new JButton(退出); frame.setContentPane(contentPane);注意 :一个组件只能在某一个容器中放置一次。 如果一个组件已经在一个容器, 而要将 其放置在其他容器中时,这个组件就会从一个容器中被清除。2. 创建对话框( JDialog )可以用 JDialog 来创建一个对话框。对话框分为模式对话框和非模式对话框。模式对话 框只能在结束对话框的操作后回到原来的窗口, 而非模式对话框可以在对话框与其所属的窗 口之间互相切换。另外,一个对话框必须以另一个对话框或框架窗口(JFrame)作为其拥有者,即一个对话框要依附于另一个对话框或框架窗口。这是与JFrame较不同的,JFrame可独立地存在。创建 JDialog 对话框常用的构造方法是 :JDialog() :新建一个无标题的非模式对话框。JDialog(Dialog owner, boolean modal) :新建一个无标题的、由 modal 指定的其模式 对话框, modal 为 true 时为模式对话框。JDialog(Frame owner. String title, boolean modal):新建一个标题为 title、由 modal 指定的其模式对话框。以上构造方法由 owner 指出其拥有者。3. 创建简单的对话框对话框是应用程序最常用的组件,使用 JDialog 创建一个对话框的过程比较繁琐,如需 要向对话框中添加各种组件才能成为一个可用的对话框。对于一些常用的比较简单的对话 框,可以使用 javax.swing 包中 JOptionPane 类提供的静态方法将对话框直接显示出来, 以简 化程序的设计。JOptionPane类提供的对话框有三种基本格式:输出信息对话框、输入信息对话框和确 认对话框。这些对话框的显示由形如show xxx Dialog的静态方法完成。下面举例说明其用法:(1)显示一个输出信息对话框显示一个输出信息对话框要使用JOptionPane类的showMessageDialog方法,该方法般要指定一个显示该对话框的父窗口。例如有下面的程序段:JFrame f = new JFrame();JOptio nPa ne.showMessageDialog(f, Hello,Java!);JOptio nPan e.showMessageDialog(f,Hello,Java!,这是一个有标题的输出信息窗 口 ! ,JOptionPaneNFORMATION_MESSAGE);该程序段执行的结果如图9-4所示:(T) HelloJaua!确定(a)(b)图9-4案例9-1的显示效果以上两个方法在父窗口f中显示一个输出信息对话框,对话框的内容为Hello,Java!,前面的一个对话框默认的标题信息”,如图9-4(a)所示,后一个对话框指定了一个标题“这是一个有标题的输出信息窗口!”,并指定输出信息的类型,如图9-4(b)所示。showMessageDialog方法也可以将父窗口指定为空(即null),例如:JOptionPane.showMessageDialog(null, Hello,Java!);输出的信息可以用 JOptio nPane类的常量指出:ERROR_MESSAGE :包括一个出错图标。 WARNING_MESSAGE :包括一个警告图标。 QUESTION_MESSAGE :包括一个问题图标。PLAIN_MESSAGE :没有图标。INFORMA TION_MESSAGE :包括一个信息图标。(2)显示一个输入信息对话框显示一个要求用户键入字符串(String )信息的对话框,要使用JOptionPane类的show In putDialog静态方法。例如:String in putValue = JOptio nPan e.show In putDialog(Please in put a value);如果要求输入的是一个实数,可以用如下语句:float val = Float.parseFloat(JOptio nPan e.show In putDialog(Please in put a value); 该行程序执行的结果如图9-5所示:图9-56输入信息对话框(3) 显示一个确认对话框对于GUI程序中,如果对用户的输入或选择等操作要进行简单的确认,可以使用JOptionPane 类的 showConfirmDialog 静态方法。例如:JFrame frm = new JFrame(文本转换器程序”);JOptionPane.showConfirmDialog(frm,请确认您要修改吗?,请确认,JOptio nPan e.YES_NO_CANCEL_OPTION);JOptionPane.showConfirmDialog(frm,请确认您要修改吗?,” 请确认,JOptio nPan e.YES_NO_OPTION);该例中使用的showConfirmDialog方法有4个参数,分别指出父窗口、确认对话框提示 信息、确认对话框名称和确认对话框格式。以上程序段执行的结果如图9-6所示,其中图9-6(a)为前一个方法的显示的对话框,图9-6(b)为后一个方法的显示的对话框(a)showConfirmDialog方法根据用户的返回不同的整型常量值,具体情况如下:(b)图9-6确认对话框不同选择,YES_OPTION :选择 YES 时从类方法返回的值。NO_OPTION :选择了 NO 时的返回值;CANCEL_OPTION :选择 CANCEL 时的返回值;CLOSED_OPTION: 用户没有做出任何选择,而关闭了窗口时方法的返回值。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!