java 语言程序设计 李尊朝 第12章 Swing 组件
早期的JDK版本中提供了Java抽象窗口工具集(Abstract Window Toolkit, AWT),其目的是为程序员创建图形用户界面提供支持,但是AWT功能有限,因此在后来的JDK版
本中,又提供了功能更强的Swing类库。
12.1 swing组件概述
Swing包含了大部分与AWT对应的组件 。多数Swing组件以字母“J”开头。
Swing组件的用法与AWT组件基本相同,大多数AWT组件只要在其类名前加J即可转换成Swing组件
Swing与AWT的异同:
1.Swing组件与AWT组件最大的不同是,Swing组件在实现时不包含任何本地代码,因此Swing组件可以不受硬件平台的限制,而具有更多的功能。
2.Swing组件比AWT组件拥有更多的功能。
3.Swing库是抽象窗口工具AWT库的扩展,提供了比AWT更多的特性和工具,用于建立更复杂的图形用户界面。
12.2 窗口
采用JFrame框架作为容器。JFrame类是从Frame类派生的,其构适方法及成员方法如表12-1和表12-2所示
表 12-1 JFrame的构造方法
表12-2 JFrame的成员方法
每个JFrame窗口都有一个内容窗格(contant pane),窗口中除菜单之外的所有组件都放在其内容窗格中。
要将组件添加到其内容窗格中,首先用JFrame类的getContentPane()方法获得其缺省的内容窗格,getContentPane()方法的返回类型是java.awt.Container,然
后使用add()
方法将组件添加到其内容窗格中。这与在Frame窗口中直接使用add()方法添加组件明显不同
12.3 标签
Swing中的标签组件JLabel与AWT中标签组件Label相似,可以显示文本。
JLabel组件还可以显示图标,当鼠标的指针移动到标签上时,还会显示一段提示信息。
表12-3 JLabel的构造方法
表12-4 Jlabel的成员方法
12.4 按钮
在Swing中,所有按钮都是由AbstractButton类派生的。
Swing中按钮的功能较AWT中的按钮功能更加强大,包括给按钮添加图像、使用快捷键以及设置按钮的对齐方式,还可以将多个图像分配给一个按钮以处理鼠标在
按钮上的停留等。
表12-5 JButton类的构造方法
12.5 单选按钮和复选框
要让多个单选按钮位于同一组,必须使用按钮组类ButtonGroup。ButtonGroup是java.swing包中的类,但不是JComponent的子类。 调用ButtonGroup类的add()方
法可以将一个按钮添加到一个ButtonGroup对象中。
JRadioButton类的构造方法如表12-6所示
表12-6 JRadionButton类的构造方法
例12-1 Swing 单选按钮举例
窗口中有标题为Plain、Bold和Italic的3个单选按钮和1个标签,当选择任一单选按钮时,标签中显示该单选按钮被选中的信息。
package example12_1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JRadio extends JFrame{
private JLabel lbl;
private JRadioButton pla, bol,ita;
private ButtonGroup buttonG;
public JRadio()
{
super("JRadioButton Example");
Container c = getContentPane(); //获得窗口内容窗格,其返回类型是container类
c.setLayout( new FlowLayout() );
lbl=new JLabel("Plain is selected");
pla=new JRadioButton("Plain",true);
bol=new JRadioButton("Bold",false);
ita=new JRadioButton("Italic",false);
c.add(pla);
c.add(bol);
c.add(ita);
c.add(lbl);
pla.addItemListener(new Handler1());
bol.addItemListener(new Handler1());
ita.addItemListener(new Handler1());
buttonG = new ButtonGroup(); //实例化buttonGroup对象buttonG,调用add()方法分别将pla\bol\ita加入buttonG
buttonG.add(pla);
buttonG.add(bol);
buttonG.add(ita);
setSize(200,150);
setVisible(true);
}
public static void main(String args[])
{
JRadio app = new JRadio(); //通过new jradion()实例化对象app.
app.addWindowListener(new Handler2());
}
class Handler1 implements ItemListener //选择内部类handler1对itemEvent事件进行监听,所以handler1必须实现itemlistner接口
{
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==pla)
lbl.setText("Plain is selected");
else if(e.getSource()==bol)
lbl.setText("Bold is selected");
else
lbl.setText("Italic is selected");
}
}
static class Handler2 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit( 0 );
}
}
}(a)初始界面 (b)选中Bold后的界面
表12-7 JCheckBox类的构造方法
例12-2 SWing复选框举例
编程实现:窗口中有标题为Plain和Bold的2个复选框及2个标签,在第1个标签中显示Plain复选框是否被选中的信息,在第2个标签中显示Bold复选框是否被选中的信息package example12_2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JCheck extends JFrame{要创建JFrame窗口,JCheck类需要继承JFrame类.
private JLabel lblp,lblb;
private JCheckBox pla,bol;
public JCheck()
{
super("JCheckBox"); //调用父类的构造方法.
Container c = getContentPane();
c.setLayout( new FlowLayout() );
pla=new JCheckBox("Plain",true);
bol=new JCheckBox("Bold",false);
lblp=new JLabel("Plain is selected");
lblb=new JLabel("Bold is not selected");
c.add(pla);
c.add(bol);
c.add(lblp);
c.add(lblb);
pla.addItemListener(new Handler1());
bol.addItemListener(new Handler1());
setSize(200,150);
setVisible(true);
}
public static void main(String args[])
{
JCheck app = new JCheck(); //通过 new jcheck()实例化JCheck对象app,使程序运行.由于要选择内部类handler2的//对象对WindowEvent事件进行监听,所以Handler2需要继承windowadapter类,覆盖其中的//windowclosing()方法,终止程序的运行.
app.addWindowListener(new Handler2());
}
class Handler1 implements ItemListener //选择内部类Handler1的对象对pla和bol的itemEvent事件进行监听.
{
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==pla)
if (e.getStateChange()==ItemEvent.SELECTED)
lblp.setText("Plain is selected");
else
lblp.setText("Plain is not selected");
if(e.getSource()==bol)
if (e.getStateChange()==ItemEvent.SELECTED)
lblb.setText("Bold is selected");
else
lblb.setText("Italic is selected");
}
}
static class Handler2 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit( 0 );
}
}
}
12.6 文本编辑组件
swing 文本编辑组件有文本行\密码行\文本区
文本行JTextField是一个单行文本编辑框,用于输入1行文字,用法与TextField相同。
文本行是由java.awt包中的JTextField类来创建。
表12-8 JTextField类的构造方法
表12-9 JTextField类的成员方法
密码行JPasswordField是JTextField的子类,用于编辑作为密码的1行文本。在其中输入字符时,不显示原字符,而显示“*”。
文本区JTextArea是一个多行文本编辑框,其基本操作与JTextField类似,但增加了滚动条功能。
表12-10 JTextArea类的构造方法
表12-11 JTextArea类的成员方法
12.7 列表框和组合框
当供选择的选项较少时,通常使用单选按钮和复选框。但当选项很多时,可以使用列表框JList或组合框JComboBox。
列表框JList能容纳并显示一组选项,从中可以选择1项或多项
表12-12 Jlist类的构造方法
表12-13 JList类的成员方法
组合框JComboBox由一个文本行和一个列表框组成。组合框通常显示形式是右边带有下拉箭头的文本行,列表框是隐藏的,
单击右边的下拉箭头才可以显示列表框。既可以在组合框的文本行中直接输入数据,也可以从其列表框中选择数据项,被选择的数据项显示在文本行中
表12-14 JComboBox类的构造方法
表12-15 JComboBox类的成员方法
当选择组合框中某个选项时,触发itemEvent事件.响应itemEvent事件的监听器必须实现itemlistner接口,实现其中声明的itemstastechanged()方法
public void itemStateChanged(ItemEvent e)
向文本行中输入文本并按回车键时,触发ActionEvent事件.响应ActionEvent事件的监听器必须实现ActionListener接口,实现其中声明的actionPerformed()方法:
public void actionPerformed(ActionEvent e)
package example12_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class JCom extends JFrame{
private JComboBox lst;
private JLabel lbl;
private Object cities[]={"北京市","上海市","天津市","重庆市","郑州市","太原市","石家庄市"};
public JCom()
{
super("JComboBox" );
Container c=getContentPane();
c.setLayout(new FlowLayout());
lst=new JComboBox(cities);
lst.setMaximumRowCount(4);
lbl=new JLabel("请从组合框中选择 ");
c.add(lst);
c.add(lbl);
lst.addItemListener( new Handler1());
setSize(300,150);
setVisible(true);
}
public static void main(String args[])
{
JCom app=new JCom();
app.addWindowListener(new Handler2());
}
class Handler1 implements ItemListener
{
public void itemStateChanged( ItemEvent e )
{ lbl.setText("您选中了:"+lst.getSelectedItem());
}
}
static class Handler2 extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}![]()
a)初始界面 (b)显示列表框的界面 (c) 选中“天津市”后的界面
12.8 菜单
在Java中,一个完整的菜单由3种菜单类创建:
1 菜单栏类JMenuBar
2 菜单类JMenu
3. 菜单项类JMenuItem
图12-5 三种菜单类对象
菜单栏(JMenuBar)是窗口中用于容纳菜单(JMenu)的容器。JMenuBar提供的add()方法用来添加菜单,一个菜单栏通常可以添加多个菜单。
菜单栏不支持事件监听器,在菜单栏区域所产生的所有事件都会被菜单栏自动处理。
JFame类提供的setJMenuBar()方法用业将菜单栏放置于框架窗口上方,其声明如下:
public void setJMenuBar(JMenubar menubar)
JMnumBar 类的的构造方法和常用成员方法如表12-16所示.
表12-16 JMenuBar类的方法
菜单(JMenu)是一组菜单(JMenuItem)的容器或另一个菜单的容器,每个菜单有一个标题。JMenu类提供的add()方法用来添加菜单项或另一个菜单。
一个菜单中加入另一个菜单,构成二级子菜单。
表12-17 JMenu类的构造方法
表12-18 JMenu类的成员方法
菜单项(JMenuItem)是组成菜单的最小单位,在菜单项上可以注册ActionEvent事件监听器。当单击菜单项时,执行actionPerformed()方法
例12-4 Swing 菜单举例
编程实现:窗口中有1个菜单栏和1个标签,菜单栏中包含color和exit 2个菜单。在color菜单中包含green、yellow和blue 3个菜单项
,当选择某一菜单项时,使标签标题更改为所选择的颜色。在exit菜单中仅包含1个菜单项“close window”,当选择该菜单项时,将结束程序运行。
package example12_4;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MyMenu extends JFrame{
private JLabel lbl;
private JMenuBar mb;
private JMenu col,ext;
private JMenuItem gre,yel,blu,clo;
public MyMenu()
{
super("MyMenu");
Container c = getContentPane();
mb=new JMenuBar();
col=new JMenu("color");
ext=new JMenu("exit");
gre=new JMenuItem("green");
yel=new JMenuItem("yellow");
blu=new JMenuItem("blue");
clo=new JMenuItem("close window");
gre.addActionListener(new Handler1());
yel.addActionListener(new Handler1());
blu.addActionListener(new Handler1());
clo.addActionListener(new Handler1());
mb.add(col);
mb.add(ext);
col.add(gre);
col.add(yel);
col.add(blu);
ext.add(clo);
setJMenuBar(mb);
lbl=new JLabel("Menu Example");
add(lbl);
setSize(200,150);
setVisible(true);
}
public static void main(String args[])
{
MyMenu app=new MyMenu();
}
class Handler1 implements ActionListener
{
public void actionPerformed(ActionEvent e )
{
JMenuItem mi=(JMenuItem) e.getSource();
if (mi==gre)
lbl.setForeground(Color.green);
if (mi==yel)
lbl.setForeground(Color.yellow);
if (mi==blu)
lbl.setForeground(Color.blue);
if (mi==clo)
System.exit(0);
}
}
}
(a)初始界面 (b) color菜单