在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中一些独有的组件。
Swing类能够实现—个叫做Meta的用户界面,Swing类是Java基本类库的一部分,它在Java程序中提供了图形化的用户界面,并且能够接收来自键盘、鼠标和其他输入设备的用户输入。
Swing库是Abstract Window Toolkit的一个扩展,它提供了比AWT改进得多的功能:新的组件、扩展的组件属性、更好的事件处理和一个可选的外观。使用Swing创建应用程序时需要用到下面的组件。
· 框架:包含了标题栏和菜单栏的一个窗口,同时还包含了最大化、最小化和关闭按钮。
· 容器:包含其他组件的界面元素。
· 按钮:可单击的区域,上面带有指明其目的的文本或者图形。
· 标签:提供信息的文本或者图形。
· 文本框:接收键盘输入和允许编辑文本的窗口。
· 组合框:一个文本框和下拉列表的组合。
· 复选框和单选按钮:可以被选中或者不被选中的小方框或者小圆圈。
Swing的文本框被封装为JTextComponent类,它是JComponent的子类。它提供了Swing文本组件的公共功能。它的一个子类是JTextField,JtextField类可以编辑单行文本,它的构造函数如下所示。
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 创建一个文本框
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)
其中,di、pi、si和ri是不同状态下使用的图标。
可以通过下列方法读写与按钮相关的文字。
String getText( )
void setText(String s)
其中,s是与按钮相关的文字。
AbstractButton抽象类的子类在按钮被按下时生成行为事件。通过如下的方法注册和注销这些事件的监听器。
void addActionListener(ActionListener al)
void removeActionListener(ActionListener al)
其中,al是动作监听器。
AbstractButton是按钮、复选框和单选按钮的父类。按钮、复选框和单选按钮将在下面的章节中介绍。
JButton类提供一个按钮的功能。JButton类允许用图标或字符串或两者同时提供与下压式按钮相关联的功能。类的构造函数如下所示。
JButton(Icon i)
JButton(String s)
JButton(String s, Icon i)
其中,s和i是按钮使用的字符串和图标。
【例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.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所示。
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指定。如果state为true,则复选框在初始化时状态为被选中,否则相反。
通过下列方法改变复选框状态。
void setSelected(boolean state)
其中,如果复选框的state为true,则复选框被选中。
本例说明如何创建包括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个复选框和一个文本框
单选按钮由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指定。如果state为true,则单选按钮被初始化为选中状态,否则为非选中状态。
单选按钮必须配置成组。每次一个组内只能选中一个单选按钮。例如,如果用户单击组内的一个单选按钮,则组内先前被选中的单选按钮自动变成非选中状态。实例化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个单选按钮和一个文本框
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 创建一个组合框和一个标签
|
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所示。