java 语言程序设计 李尊朝 第12章 Swing 组件

             早期的JDK版本中提供了Java抽象窗口工具集(Abstract Window Toolkit, AWT),其目的是为程序员创建图形用户界面提供支持,但是AWT功能有限,因此在后来的JDK版

              本中,又提供了功能更强的Swing类库。

12.1 swing组件概述

              Swing包含了大部分与AWT对应的组件 。多数Swing组件以字母“J”开头。

              Swing组件的用法与AWT组件基本相同,大多数AWT组件只要在其类名前加J即可转换成Swing组件

             image

           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-1

        表12-2 JFrame的成员方法

        12-2

           每个JFrame窗口都有一个内容窗格(contant pane),窗口中除菜单之外的所有组件都放在其内容窗格中。

           要将组件添加到其内容窗格中,首先用JFrame类的getContentPane()方法获得其缺省的内容窗格,getContentPane()方法的返回类型是java.awt.Container,然

           后使用add()

           方法将组件添加到其内容窗格中。这与在Frame窗口中直接使用add()方法添加组件明显不同

12.3 标签

           Swing中的标签组件JLabel与AWT中标签组件Label相似,可以显示文本。

           JLabel组件还可以显示图标,当鼠标的指针移动到标签上时,还会显示一段提示信息。

         表12-3 JLabel的构造方法

         12-3

        表12-4 Jlabel的成员方法

          12-4

12.4 按钮

           在Swing中,所有按钮都是由AbstractButton类派生的。

            Swing中按钮的功能较AWT中的按钮功能更加强大,包括给按钮添加图像、使用快捷键以及设置按钮的对齐方式,还可以将多个图像分配给一个按钮以处理鼠标在

             按钮上的停留等。

                     表12-5 JButton类的构造方法

                      12-5

         12.5 单选按钮和复选框

                       要让多个单选按钮位于同一组,必须使用按钮组类ButtonGroup。ButtonGroup是java.swing包中的类,但不是JComponent的子类。 调用ButtonGroup类的add()方

                       法可以将一个按钮添加到一个ButtonGroup对象中。

                      JRadioButton类的构造方法如表12-6所示

                      表12-6 JRadionButton类的构造方法

                     12-6

                  例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 );
}
}
}
       image                             image

                    (a)初始界面                                                                        (b)选中Bold后的界面

                                
        表12-7 JCheckBox类的构造方法
        12-7

                 例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 );
}
}
}
image
a)初始界面 (b)选中Bold后的界面 (c)Plain和Bold都未选中时的界面

       12.6 文本编辑组件

             swing 文本编辑组件有文本行\密码行\文本区

             文本行JTextField是一个单行文本编辑框,用于输入1行文字,用法与TextField相同。

             文本行是由java.awt包中的JTextField类来创建。

            表12-8 JTextField类的构造方法

           12-8

           表12-9 JTextField类的成员方法

           12-9

             密码行JPasswordField是JTextField的子类,用于编辑作为密码的1行文本。在其中输入字符时,不显示原字符,而显示“*”。

             文本区JTextArea是一个多行文本编辑框,其基本操作与JTextField类似,但增加了滚动条功能。

             表12-10 JTextArea类的构造方法

            12-10

           表12-11 JTextArea类的成员方法

              12-11

      12.7 列表框和组合框

                当供选择的选项较少时,通常使用单选按钮和复选框。但当选项很多时,可以使用列表框JList或组合框JComboBox。

               列表框JList能容纳并显示一组选项,从中可以选择1项或多项

                表12-12 Jlist类的构造方法

                12-12 

               表12-13 JList类的成员方法

                12-13

              组合框JComboBox由一个文本行和一个列表框组成。组合框通常显示形式是右边带有下拉箭头的文本行,列表框是隐藏的,

              单击右边的下拉箭头才可以显示列表框。既可以在组合框的文本行中直接输入数据,也可以从其列表框中选择数据项,被选择的数据项显示在文本行中

               表12-14 JComboBox类的构造方法

                12-14

              表12-15   JComboBox类的成员方法

                12-15

             当选择组合框中某个选项时,触发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);
}
}
}
imageimage

                   a)初始界面                                        (b)显示列表框的界面                    (c) 选中“天津市”后的界面

            12.8 菜单

                        在Java中,一个完整的菜单由3种菜单类创建:

                       1  菜单栏类JMenuBar

                       2  菜单类JMenu

                       3. 菜单项类JMenuItem

                        image  

 

                            图12-5 三种菜单类对象

                         菜单栏(JMenuBar)是窗口中用于容纳菜单(JMenu)的容器。JMenuBar提供的add()方法用来添加菜单,一个菜单栏通常可以添加多个菜单。

                          菜单栏不支持事件监听器,在菜单栏区域所产生的所有事件都会被菜单栏自动处理。

                           JFame类提供的setJMenuBar()方法用业将菜单栏放置于框架窗口上方,其声明如下:

                           public void setJMenuBar(JMenubar menubar)

                            JMnumBar 类的的构造方法和常用成员方法如表12-16所示.

                            表12-16 JMenuBar类的方法

                           12-16

                             菜单(JMenu)是一组菜单(JMenuItem)的容器或另一个菜单的容器,每个菜单有一个标题。JMenu类提供的add()方法用来添加菜单项或另一个菜单。

                             一个菜单中加入另一个菜单,构成二级子菜单。

                            表12-17 JMenu类的构造方法

                            12-17

                           表12-18 JMenu类的成员方法

                              12-18

                              菜单项(JMenuItem)是组成菜单的最小单位,在菜单项上可以注册ActionEvent事件监听器。当单击菜单项时,执行actionPerformed()方法

                             12-19

                          例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);
}
}
}
image

                          

                (a)初始界面                                                         (b) color菜单

posted @ 2013-06-13 08:54  elite_2012  阅读(606)  评论(0编辑  收藏  举报