《JavaTM程序设计语言 基础》第 1 部分
第 4 课:创建用户界面

[<<返回] [目录] [下一个>>]

前一课中,我们讨论了 Applet 类是如何提供 Panel 组件而使您能够设计 applet 程序的用户界面的。本课将利用处理用户事件的 JavaTM Foundation Classes (JFC) Project Swing API 对第 1 和 第2 课中的基本应用程序进行扩展,以为其提 供一个用户界面。


注意:有关这些概念的信息,请参阅 Project Swing 和 Java 二维图形

Project Swing APIs

与第 3 课中把用户界面附加到嵌套于顶层浏览器中的 panel 对象的 applet 程 序不同的是,本课中的 Project Swing 应用程序是把其用户界面附加到嵌套于顶 层frame(方框)对象中的 panel 对象中。方框对象是给出标题、banner和管理 窗口外观和动作的方法的顶层窗口。

这个简单的应用程序应用了Project Swing 代码。启动应用程序时,会出现左 侧所示的窗口;点击按钮时,则会出现右侧的窗口。再次点击按钮后,您将回到 最初的左侧窗口。

应用程序开始时

点击按钮时

导入语句

以下为 SwingUI.java 方法代码。方法代码顶部有四行导入语句。这几行代码清楚地表明了程序要使用 的 JavaTM API 类。若要导入整个 awt 程序 包,可用 import java.awt.*;; 代替所有这四行代码;但是这样不 仅会导入您所需要的类,还导入了您不需要的类,从而增加了编译时的资源开销。

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

类的声明

上述四行代码之后是类的声明,类声明的作用是指示应用程序用户界面的顶层 方框为实现 ActionListener 界面的 JFrame 类。

class SwingUI extends JFrame
        implements ActionListener{

JFrame 类扩展了作为抽象窗口工具包(AWT)API 一部分的 Frame 类。Project Swing 扩展了AWT支持全套 GUI 组件和服务功 能、可插入 look and feel 功能及残疾辅助技术。有关 Project Swing 的详细 介绍见 Swing 连接 Swing 基础第 1 部分

Java API 给出供您使用的类和接口,接口定义的是一套方法但并不实现这些 方法。SwingUI 类声明的其余内容表明该类将实现 ActionListener 接口。这表示 SwingUI 类必需实现 ActionListener 接口中定义的全部方法。幸好只有一个 actionPerformed,下文将予以讨论。

实例变量

类声明之后的代码行是对 SwingUI 类使用的 Project Swing 子类进行声明。它们是可被示例类中的任何方法所访问的实例变量。在本例中, 它们是在 SwingUI 构造函数中生成的并在 actionPerformed 方法实现时被访问。private boolean 实例变量仅对 SwingUI 类可见并在 actionPerformed 方法中被用于检查按钮是否被点击。

   JLabel text, clicked;
   JButton button, clickButton;
   JPanel panel;
   private boolean _clickMeMode = true;

构造函数

构造函数(如下所述)用于创建用户界面组件和 JPanel 对象、 把组件添加到 JPanel 对象中、把 panel 添加到方框中并创建 JButton 组件事件监视器。JFrame 对象是在程序启 动时在 main 方法中生成的。

   SwingUI(){
     text = new JLabel("I'm a Simple Program");
     clicked = new JLabel("Button Clicked");

     button = new JButton("Click Me");
//Add button as an event listener
     button.addActionListener(this);

     clickButton = new JButton("Click Again");
//Add button as an event listener
     clickButton.addActionListener(this);

//Create panel
     panel = new JPanel();
//Specify layout manager and background color
     panel.setLayout(new BorderLayout(1,1));
     panel.setBackground(Color.white);
//Add label and button to panel
     getContentPane().add(panel);
     panel.add(BorderLayout.CENTER, text);
     panel.add(BorderLayout.SOUTH, button);
   }

当生成 JPanel 对象时,就会指定布局管理器及背景颜色。所使用 的布局管理器决定了用户界面组件在显示区内的布局情况。

本程序使用了 BorderLayout 布局管理器,该管理器把用户界面 组件安排在五个区内,如左图所示。添加组件时,应指明添加区域(北、南、东、 西或中央)。

//Create panel
     panel = new JPanel();
//Specify layout manager and background color
     panel.setLayout(new BorderLayout(1,1));
     panel.setBackground(Color.white);
//Add label and button to panel
     getContentPane().add(panel);
     panel.add(BorderLayout.CENTER, text);
     panel.add(BorderLayout.SOUTH, button);
   }

若要了解有关其它布局管理器以及如何使用这些管理器的知识,请查阅JDC文件 探索 AWT 布局管理器

JFrame 类中 getContentPane 方法的调用就 是把 Panel 添加到 JFrame 中。组件并不直接添加 到 JFrame,而是添加到其内容窗格中。因为布局管理器控制组件 的布局,它被设置在组件所在的内容窗格中。内容窗格提供使不同类型的组件在 Project Swing 中协作的功能。

动作监视

除实现 ActionListener 接口外,您还必须把事件监视器添加 到 JButton 组件中。动作监视器是 SwingUI 对象,因为它实现了 ActionListener 接口。本例中,当终端用户点击按钮时,下方的 Java 平台服务 就会把该动作(或事件)传递给 actionPerformed 方法。您所编写的代码将执行 这个 actionPerformed 方法来执行被点击按钮所对应的动作。

组件类有相应的添加方法添加动作监视器。代码中,JButton 类有一个 addActionListener 方法。传递给 addActionListener 的参数是 this,它表示 SwingUI 动作监视器被添加给该按钮,而按钮所产生的动作则因此被传送给 SwingUI 对象中的 actionPerformed 方法。

     button = new JButton("Click Me");
//Add button as an event listener
     button.addActionListener(this);

事件处理

actionPerformed 方法传递代表所发生的动作事件的事件对象。之后,此方法 再使用一个 if 语句来判断哪一个组件发生了该事件,并根据判断结果采取相应 的动作。

   public void actionPerformed(ActionEvent event){
     Object source = event.getSource();
        if (_clickMeMode) {
          text.setText("Button Clicked");
          button.setText("Click Again");
          _clickMeMode = false;
        } else {
          text.setText("I'm a Simple Program");
          button.setText("Click Me");
          _clickMeMode = true;
        }
   }

不同组件的事件处理说明见 Java 教程 中的 事件处理 部分

Main方法

main 方法(主方法)的功能是生成顶层 frame (方框)、设定方框标题并嵌入指示终端用户通过方框菜单关闭窗口的代码。

public static void main(String[] args){
//Create top-level frame
  SwingUI frame = new SwingUI();
  frame.setTitle("Example");
//This code lets you close the window
  WindowListener l = new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
       System.exit(0);
     }
  };
    frame.addWindowListener(l);
//This code lets you see the frame
  frame.pack();
  frame.setVisible(true);
 }
}

关闭窗口的代码为给程序添加事件处理功能提供了一个简便的方法。如果您所 需要的事件监视器接口所提供的功能比程序实际使用的功能多,则请使用adapter (适配器) 类。Java API 为带一个以上方法的所有监视器接口提供适配器类。这样 ,您就可以用适配器类来代替监视器接口,从而只执行您所需要的方法。示例中, WindowListener 接口有 7 个方法,而本程序只需要执行 windowClosing 方法, 所以该示例用 WindowAdapter 类代替。

这段代码对 WindowAdapter 类进行了扩展而重载了windowClosing 方法。 新 的关键字生成了已扩展的内部类的一个无名实例。之所以无名,是因为您没有为 这个类赋予一个名称,并且若不再次执行其代码的情况下也无法生成该类的其它 实例。而它之所以是一个内部类,是因为扩展后的类定义嵌套在 SwingUI 类中。

这种方法只需要几行代码即可实现,而执行 WindowListener 接口则需要实现 6 个空方法。务必把 WindowAdapter 对象添加到主框对象中,这样方框对象才会 监视窗口事件。

   WindowListener l = new WindowAdapter() {
 //The instantiation of object l is extended to 
 //include this code:
     public void windowClosing(WindowEvent e){
        System.exit(0);
     }
   }; 
   frame.addWindowListener(l);

Applet 程序再访问

利用您在 第 3 课:创建 Applet 程序 和本课中所学到的知识,把本课示例程序转换 成一个 applet 程序。您应亲自尝试,然后再看其 答案

简言之,applet 和应用程序版本之间的区别如下:

  • applet 类被声明为 public,这样就可以为 appletviewer 所访问。
  • applet 类继承于Applet,而应用程序类则继承于 JFrame
  • applet 版本没有 main 方法。
  • applet 中应用程序构造函数被 startinit 方法所代替。
  • GUI 组件是直接添加到 Applet 的;而对于应用程序而言, GUI 组件则添加到其 JFrame 对象的内容窗格中。

更多信息

有关 Project Swing 的详细介绍,请参阅 Swing Connection Swing 基础第 1 部分

或者参阅 JFC Project Swing 教程:GUI 构建指南

若欲了解有关其他可用布局管理器和任何使用这些管理器的知识,请参阅 JDC 文件 开发 AWT 布局管理器

[TOP]

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null