您的位置: 网站首页 > 程序开发 > Java程序设计 > 第10章 图形用户界面 > 【10.4 Swing组件】

10.4 Swing组件

 

10.4  Swing组件

Swing中大量使用了MVC体系结构。MVC是现有的编程语言中制作图形用户界面的一种通用的思想,其思路是把数据的内容本身和显示方式分离开,这样就使得数据的显示更加灵活多样。在一个MVC用户界面中,存在3个对象:模型、视图和控制器。模型是指定的逻辑表示法,视图是模型的可视化表示法,而控制器则指定了如何处理用户输入。当模型发生改变时,它会通知所有依赖它的视图,视图则使用控制器指定采取的行为。

在使用Swing进行编程的时候,需要注意它与AWT的不同之处,如下所示。

·    Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(Content Panel)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。

·    Swing组件以“J”开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一些丰富的高层组件,如表格(JTable)、树(JTree)等。

·    Swing中不但用轻量级的组件替代了AWT中的重量级的组件,而且Swing的替代组件中都包含一些其他的特性,例如,Swing的按钮和标签可显示图标和文本。

·    AWT中的组件与Swing中的替代组件的使用方法类似,下面介绍Swing中一些独有的组件。

10.4.1  Swing组件关系概述

Swing类能够实现—个叫做Meta的用户界面,Swing类是Java基本类库的一部分,它在Java程序中提供了图形化的用户界面,并且能够接收来自键盘、鼠标和其他输入设备的用户输入。

Swing库是Abstract Window Toolkit的一个扩展,它提供了比AWT改进得多的功能:新的组件、扩展的组件属性、更好的事件处理和一个可选的外观。使用Swing创建应用程序时需要用到下面的组件。

·    框架:包含了标题栏和菜单栏的一个窗口,同时还包含了最大化、最小化和关闭按钮。

·    容器:包含其他组件的界面元素。

·    按钮:可单击的区域,上面带有指明其目的的文本或者图形。

·    标签:提供信息的文本或者图形。

·    文本框:接收键盘输入和允许编辑文本的窗口。

·    组合框:一个文本框和下拉列表的组合。

·    复选框和单选按钮:可以被选中或者不被选中的小方框或者小圆圈。

10.4.2  文本框

Swing的文本框被封装为JTextComponent类,它是JComponent的子类。它提供了Swing文本组件的公共功能。它的一个子类是JTextFieldJtextField类可以编辑单行文本,它的构造函数如下所示。

JTextField()

JTextField(int cols)

JTextField(String s, int cols)

JTextField(String s)

其中,s是要显示的字符串,cols是文本框中的列数。

【例10-5创建一个文本框。小应用程序获得内容窗格,然后分配一个流布局作为布局管理器。接着,创建一个JTextField对象,将其加入内容窗格。

packagechap10;

importjava.awt.Container;

importjava.awt.FlowLayout;

importjavax.swing.JApplet;

importjavax.swing.JTextField;

/*

<applet code="JTextFieldDemo" width=300 height=50>

</applet>

*/

publicclas JTextFieldDemo extends JApplet {

    JTextField jtf;

    public void init() {

        // Get content pane

        Container contentPane = getContentPane();

        contentPane.setLayout(new FlowLayout());

        // Add text field to content pane

        jtf = new JTextField(15);

        contentPane.add(jtf);

    }

}

这个小应用程序的输出如图10-8所示。

10-8  创建一个文本框

10.4.3  按钮

Swing的按钮相对于AWT中的Button类提供了更多功能,例如,可以用一个图标修饰Swing的按钮。Swing的按钮是AbstractButton的子类,AbstractButton类扩展JComponent类。AbstractButton类包含多种方法,用于控制按钮行为、检查复选框和单选按钮。例如,当按钮被禁止、按下或选择时,可以将其显示为不同的图标。还可以定义一个rollover”图标,用于当鼠标移动到按钮上时显示。下面是控制这类行为的方法。

void setDisabledIcon(Icon di)

void setPressedIcon(Icon pi)

void setSelectedIcon(Icon si)

void setRolloverIcon(Icon ri)

其中,dipisiri是不同状态下使用的图标。

可以通过下列方法读写与按钮相关的文字。

String getText( )

void setText(String s)

其中,s是与按钮相关的文字。

AbstractButton抽象类的子类在按钮被按下时生成行为事件。通过如下的方法注册和注销这些事件的监听器。

void addActionListener(ActionListener al)

void removeActionListener(ActionListener al)

其中,al是动作监听器。

AbstractButton是按钮、复选框和单选按钮的父类。按钮、复选框和单选按钮将在下面的章节中介绍。

1JButton

JButton类提供一个按钮的功能。JButton类允许用图标或字符串或两者同时提供与下压式按钮相关联的功能。类的构造函数如下所示。

JButton(Icon i)

JButton(String s)

JButton(String s, Icon i)

其中,si是按钮使用的字符串和图标。

【例10-6显示3个按钮和一个文本框。每个按钮显示为一个图标,使用的图标是一个国家的国旗。当按下按钮时,在文本域中显示国家的名字。小应用程序程序先获取内容窗格,然后设置窗格的布局管理器。创建3个图形按钮,加入内容窗格。然后,小应用程序注册接收按钮产生的事件。创建文本框,将其加入小应用程序。最后,动作事件的处理程序将与按钮相关的命令字符串显示在文本框中。

packagechap10;

importjava.awt.Container;

importjava.awt.FlowLayout;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjavax.swing.ImageIcon;

importjavax.swing.JApplet;

importjavax.swing.JButton;

importjavax.swing.JTextField;

/*

<applet code="JButtonDemo" width=250 height=300>

</applet>

*/

publicclass JButtonDemo extends JApplet implements ActionListener {

    JTextField jtf;

 

    public void init() {

        // Get content pane

        Container contentPane = getContentPane();

        contentPane.setLayout(new FlowLayout());

        // Add buttons to content pane

        ImageIcon france = new ImageIcon("chap10/france.gif");

        JButton jb = new JButton(france);

        jb.setActionCommand("France");

        jb.addActionListener(this);

        contentPane.add(jb);

        ImageIcon germany = new ImageIcon("chap10/germany.gif");

        jb = new JButton(germany);

        jb.setActionCommand("Germany");

        jb.addActionListener(this);

        contentPane.add(jb);

        ImageIcon italy = new ImageIcon("chap10/italy.gif");

        jb = new JButton(italy);

10-9  显示3个按钮和一个文本框

 

        jb.setActionCommand("Italy");

        jb.addActionListener(this);

        contentPane.add(jb);

        // Add text field to content pane

        jtf = new JTextField(15);

        contentPane.add(jtf);

    }

    public void actionPerformed(ActionEvent ae) {

        jtf.setText(ae.getActionCommand());

    }

}

小应用程序的输出如图10-9所示。

2.复选框

JCheckBox类提供复选框的功能,它是AbstractButton抽象类的子类。其构造函数如下所示。

JCheckBox(Icon i)

JCheckBox(Icon i, boolean state)

JCheckBox(String s)

JCheckBox(String s, boolean state)

JCheckBox(String s, Icon i)

JCheckBox(String s, Icon i, boolean state)

其中,i是复选框的图标,文字由s指定。如果statetrue,则复选框在初始化时状态为被选中,否则相反。

通过下列方法改变复选框状态。

void setSelected(boolean state)

其中,如果复选框的statetrue,则复选框被选中。

本例说明如何创建包括4个复选框和一个文本框的小应用程序。当选中一个复选框,其对应文字显示在文本框中。JApplet对象的内容窗格包括在内,同时分配了一个流布局给布局管理器。然后,在内容面板中加入4个复选框,并为正常(normal)、滚过(rollover)和选中(selected)状态分配图标。小应用程序注册以接受事件。最后在内容窗格中加入文本框。

【例10-7本例设置文本框。当选中或取消复选框时,生成一个项目事件。这个事件由itemStateChanged( )处理。在itemStateChanged( )内部,getItem( )方法获取产生事件的Jcheck-

Box对象,getText( )方法获取复选框的文字,并用这个文字设置文本框。

packagechap10;

importjava.awt.Container;

importjava.awt.FlowLayout;

importjava.awt.event.ItemEvent;

importjava.awt.event.ItemListener;

importjavax.swing.ImageIcon;

importjavax.swing.JApplet;

importjavax.swing.JCheckBox;

importjavax.swing.JTextField;

/*

<applet code="JCheckBoxDemo" width=400 height=50>

</applet>

*/

publicclass JCheckBoxDemo extends JApplet implements ItemListener {

    JTextField jtf;

 

    public void init() {

        // Get content pane

        Container contentPane = getContentPane();

        contentPane.setLayout(new FlowLayout());

        // Create icons

        ImageIcon normal = new ImageIcon("chap10/normal.gif");

        ImageIcon rollover = new ImageIcon("chap10/rollover.gif");

        ImageIcon selected = new ImageIcon("chap10/selected.gif");

        // Add check boxes to the content pane

        JCheckBox cb = new JCheckBox("C", normal);

        cb.setRolloverIcon(rollover);

        cb.setSelectedIcon(selected);

        cb.addItemListener(this);

        contentPane.add(cb);

        cb = new JCheckBox("C++", normal);

        cb.setRolloverIcon(rollover);

        cb.setSelectedIcon(selected);

        cb.addItemListener(this);

        contentPane.add(cb);

        cb = new JCheckBox("Java", normal);

        cb.setRolloverIcon(rollover);

        cb.setSelectedIcon(selected);

        cb.addItemListener(this);

        contentPane.add(cb);

        cb = new JCheckBox("Perl", normal);

        cb.setRolloverIcon(rollover);

        cb.setSelectedIcon(selected);

        cb.addItemListener(this);

        contentPane.add(cb);

        // Add text field to the content pane

        jtf = new JTextField(15);

        contentPane.add(jtf);

        }

    public void itemStateChanged(ItemEvent ie) {

        JCheckBox cb = (JCheckBox) ie.getItem();

        jtf.setText(cb.getText());

    }

}

小应用程序的输出如图10-10所示。

10-10  创建4个复选框和一个文本框

3.单选按钮

单选按钮由JRadioButton类支持,JRadioButton也是AbstractButton抽象类的子类。其构造函数如下所示。

JRadioButton(Icon i)

JRadioButton(Icon i, boolean state)

JRadioButton(String s)

JRadioButton(String s, boolean state)

JRadioButton(String s, Icon i)

JRadioButton(String s, Icon i, boolean state)

其中,i是单选按钮的图标,文字由s指定。如果statetrue,则单选按钮被初始化为选中状态,否则为非选中状态。

单选按钮必须配置成组。每次一个组内只能选中一个单选按钮。例如,如果用户单击组内的一个单选按钮,则组内先前被选中的单选按钮自动变成非选中状态。实例化ButtonGroup类以创建一个单选按钮组,为此要调用其默认构造函数。然后使用下面的方法把元素加入单选按钮组。

void add(AbstractButton ab)

其中,ab是加入单选按钮组的单选按钮的引用。

【例10-8如何使用单选按钮。创建3个单选按钮和一个文本框。当一个单选按钮被按下时,其文字显示在文本框中。首先包括JApplet对象的内容窗格,分配流布局给布局管理器。然后,在内容窗格中加入3个单选按钮,再定义一个单选按钮组,将单选按钮加入。最后在内容窗格中加入文本框。

单选按钮按下产生的行为事件,由actionPerformed( )处理。getActionCommand( ) 方法获取与单选按钮相关的文字,并用此文字设置文本框。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*

  <applet code="JRadioButtonDemo" width=300 height=50>

  </applet>

*/

public class JRadioButtonDemo extends JApplet

implements ActionListener {

  JTextField tf;

public void init() {

// Get content pane

Container contentPane = getContentPane();

contentPane.setLayout(new FlowLayout());

// Add radio buttons to content pane

JRadioButton b1 = new JRadioButton("A");

b1.addActionListener(this);

contentPane.add(b1);

JRadioButton b2 = new JRadioButton("B");

b2.addActionListener(this);

contentPane.add(b2);

JRadioButton b3 = new JRadioButton("C");

b3.addActionListener(this);

contentPane.add(b3);

    // Create a text field and add it

    // to the content pane

    tf = new JTextField(5);

    contentPane.add(tf);

  }

  public void actionPerformed(ActionEvent ae) {

    tf.setText(ae.getActionCommand());

  }

}

小应用程序的输出如图10-11所示。

10-11  创建3个单选按钮和一个文本框

10.4.4  组合框

Swing通过JComboBox类支持组合框(Combo Box,一个文本框和下拉列表的组合),JComboBox类是JComponent的子类。组合框通常显示一个可选选项,也允许用户在一个下拉列表中选择多个不同选项,用户也可以在文本域内键入选项。JComboBox的两个构造函数如下所示。

JComboBox()

JComboBox(Vector v)

其中,v是初始化选择框的矢量。

使用addItem( )方法在列表中增加选项,其形式如下。

void addItem(Object obj)

其中,obj是加入组合框的对象。

【例10-9本例创建一个组合框和一个标签。标签显示一个图标。组合框的可选选项是“France”、“Germany”和“Italy”。当选择了一个图标,标签即更新为这个国家的国旗。

packagechap10;

importjava.awt.Container;

importjava.awt.FlowLayout;

importjava.awt.event.ItemEvent;

importjava.awt.event.ItemListener;

importjavax.swing.ImageIcon;

importjavax.swing.JApplet;

importjavax.swing.JComboBox;

importjavax.swing.JLabel;

/*

<applet code="JComboBoxDemo" width=300 height=100>

</applet>

*/

publicclass JComboBoxDemo extends JApplet implements ItemListener {

    JLabel jl;

    public void init() {

        // Get content pane

        Container contentPane = getContentPane();

        contentPane.setLayout(new FlowLayout());

        // Create a combo box and add it

        // to the panel

        JComboBox jc = new JComboBox();

        jc.addItem("France");

        jc.addItem("Germany");

        jc.addItem("Italy");

        jc.addItemListener(this);

        contentPane.add(jc);

10-12  创建一个组合框和一个标签

 

        // Create label

        jl = new JLabel(new ImageIcon("chap10/

france.gif"));

        contentPane.add(jl);

    }

    public void itemStateChanged(ItemEvent

ie) {

        String s = (String) ie.getItem();

        jl.setIcon(new ImageIcon("chap10/"

+ s + ".gif"));

    }

}

小应用程序的输出如图10-12所示。