《JAVA:从入门到精通》part 16

十九、Swing程序设计(三)

1. 按钮组件

  • 按钮在Swing中是较为常见的组件,用于触发特定动作。在Swing中提供多种按钮,包括提交按钮、复选框、单选按钮等。

提交按钮组件

  • Swing中的提交按钮有JButton对象表示,其构造方法主要有以下几种形式:
public JButton();
public JButton(String text);
public JButton(Icon icon);
public JButton(String text,Icon icon);
  • 通过使用上述构造方法,在Swing按钮上不仅能显示文本标签,还可以显示图标。上述构造方法中的第一个构造方法可以生成不带任何文本组件的对象和图标,可以在以后使用相应方法为按钮设置指定的文本和图标;其他构造方法都在初始化时指定了按钮上显示的图标或文字。
package com.lzw;

import java.awt.*;
import java.awt.event.*;
import java.net.*;

import javax.swing.*;

public class JButtonTest extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public JButtonTest() {
        URL url = JButtonTest.class.getResource("imageButtoo.jpg");
        Icon icon = new ImageIcon(url);
        setLayout(new GridLayout(3, 2, 5, 5)); // 设置网格布局管理器
        Container c = getContentPane(); // 创建容器
        for (int i = 0; i < 5; i++) {
            // 创建按钮,同时设置按钮文字与图标
            JButton J = new JButton("button" + i, icon);
            c.add(J); // 在容器中添加按钮
            if (i % 2 == 0) {
                J.setEnabled(false); // 设置其中一些按钮不可用
            }
        }
        JButton jb = new JButton(); // 实例化一个没有文字与图片的按钮
        jb.setMaximumSize(new Dimension(90, 30)); // 设置按钮与图片相同大小
        jb.setIcon(icon); // 为按钮设置图标
        jb.setHideActionText(true);
        jb.setToolTipText("图片按钮"); // 设置按钮提示为文字
        jb.setBorderPainted(false); // 设置按钮边界不显示
        jb.addActionListener(new ActionListener() { // 为按钮添加监听事件
            public void actionPerformed(ActionEvent e) {
                // 弹出确认对话框
                JOptionPane.showMessageDialog(null, "弹出对话框");
            }
        });
        c.add(jb); // 将按钮添加到容器中

        setTitle("创建带文字与图片的按钮");
        setSize(350, 150);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

    public static void main(String args[]) {
        new JButtonTest();
    }
}

运行结果:

单选按钮组件

  • 可以使用JRadioButton类中的构造方法创建单选按钮对象。常用的构造方法如下:
public JRadioButton();
public JRadioButton(Icon icon);
public JRadioButton(Icon icon,boolean selected);
public JRadioButton(String text);
public JRadioButton(String text,Icon icon);
public JRadioButton(String text,Icon icon,boolean selected);

复选框组件

  • 复选框在Swing组件中使用也非常广泛,它具有一个方块图标,外加一段描述性文字。与单选按钮唯一不同的是,复选框可以进行多选设置,每一个复选框都提供“选中”和“不选中”两种状态。复选框常用的构造方法如下:
public JCheckBox();
public JCheckBox(Icon icon,boolean checked);
public JCheckBox(String text,boolean checked);
  • 复选框与其他按钮设置基本相同,除了可以在初始化时设置图标之外,还可以设置复选框的文字是否被选中。
package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class CheckBoxTest extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JTextArea jt = new JTextArea(3, 10);
    private JCheckBox jc1 = new JCheckBox("1");
    private JCheckBox jc2 = new JCheckBox("2");
    private JCheckBox jc3 = new JCheckBox("3");
    public CheckBoxTest() {
        Container c = getContentPane();

        c.setLayout(new BorderLayout());

        c.add(panel1, BorderLayout.NORTH);
        final JScrollPane scrollPane = new JScrollPane(jt);
        panel1.add(scrollPane);

        c.add(panel2, BorderLayout.SOUTH);
        panel2.add(jc1);
        jc1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (jc1.isSelected())
                    jt.append("复选框1被选中\n");
            }
        });

        panel2.add(jc2);
        jc2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (jc2.isSelected())
                    jt.append("复选框2被选中\n");
            }
        });

        panel2.add(jc3);
        jc3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (jc3.isSelected())
                    jt.append("复选框3被选中\n");
            }
        });

        setSize(200, 160);
        setVisible(true);
        setTitle("复选框的使用");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new CheckBoxTest();

    }

}

运行结果:

2. 列表组件

  • Swing中提供两种列表组件,分别为下拉列表框和列表框。下拉列表框与列表框都是带有一系列项目的组件,用户可以从中选择需要的项目。列表框较下拉列表框更直观,它将所有的项目罗列在列表框中;但下拉列表框较列表框更为便捷、美观,它将所有的项目隐藏起来,当用户选用其中的项目时才会显现出来。

下拉列表框组件

  • Swing中的下拉列表框使用JComboBox类对象表示,它是javax.swing.JComponent类的子类。它的常用构造方法如下:
public JComboBox();
public JComboBox(ComboBoxModel dataModel);
public JComboBox(Object[] arrayData);
public JComboBox(Vector vector);
  • 在初始化下拉列表框时,可以选择同时指定下拉列表框中的项目内容,也可以在程序中使用其他方法设置下拉列表框中的内容,下拉列表框中的内容可以被封装在ComboBoxModel类型、数组或Vector类型中。
package com.lzw;

import java.awt.*;

import javax.swing.*;

public class JComboBoxModelTest extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    JComboBox jc = new JComboBox<>(new MyComboBox());
    JLabel jl = new JLabel("请选择证件:");

    public JComboBoxModelTest() {
        setSize(new Dimension(160, 180));
        setVisible(true);
        setTitle("在窗口中设置下拉列表框");
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        Container cp = getContentPane();
        cp.setLayout(new FlowLayout());
        cp.add(jl);
        cp.add(jc);
    }

    public static void main(String[] args) {
        new JComboBoxModelTest();
    }
}

class MyComboBox extends AbstractListModel implements ComboBoxModel {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    String selecteditem = null;
    String[] test = { "身份证", "军人证", "学生证", "工作证" };

    public String getElementAt(int index) {
        return test[index];
    }

    public int getSize() {
        return test.length;
    }

    public void setSelectedItem(Object item) {
        selecteditem = (String) item;
    }

    public Object getSelectedItem() {
        return selecteditem;
    }

    public int getIndex() {
        for (int i = 0; i < test.length; i++) {
            if (test[i].equals(getSelectedItem()))
                return i;
        }
        return 0;
    }
}

运行结果:

列表框组件

  • Swing中使用JList类对象来表示列表框,下面为常用几个构造方法:
public void JList();
public void JList(Object[] listData);
public void JList(Vector listData);
public void JList(ListModel dataModel);
  • 在上述构造方法中,存在一个没有参数的构造方法,可以通过在初始化列表框后使用setListData()方法对列表框进行设置,也可以在初始化的过程中对列表框中的项目进行设置。设置的方式有3种类型,包括数组、Vector类型和ListModel模型。
package com.lzw;

import java.awt.*;

import javax.swing.*;

public class JListTest extends JFrame {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public JListTest() {
        Container cp = getContentPane();

        cp.setLayout(null);
        JList jl = new JList<>(new MyListModel());
        JScrollPane js = new JScrollPane(jl);
        js.setBounds(10, 10, 100, 100);
        cp.add(js);
        setTitle("在这个窗体中使用了列表框");
        setSize(200, 150);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }

    public static void main(String args[]) {
        new JListTest();
    }
}

class MyListModel extends AbstractListModel {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private String[] contents = { "列表1", "列表2", "列表3", "列表4", "列表5", "列表6" };

    public String getElementAt(int x) {
        if (x < contents.length)
            return contents[x++];
        else
            return null;
    }

    public int getSize() {
        return contents.length;
    }
}

运行结果:

3. 文本组件

  • 文本组件在实际项目开发中使用最为广泛,尤其是文本框与密码框组件。通过文本组件可以很轻松地处理单行文字、多行文字、口令字段。

文本框组件

  • 在Swing中通过javax.swing.JTextField类对象创建。下面为几种常用的构造方法:
public JTextField();
public JTextField(String text);
public JTextField(int fieldwidth);
public JTextField(String text,int fieldwidth);
public JTextField(Document docModel,String text,int fieldwidth);
  • 上述构造方法看出,定义JTextField组件很简单,可以通过在初始化文本框时设置文本框的默认文字、文本框的长度等实现。
package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class JTextFieldTest extends JFrame{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    public JTextFieldTest(){
        setSize(250,100);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        Container cp=getContentPane();
        getContentPane().setLayout(new FlowLayout());
        final JTextField jt=new JTextField("求实求真,大气大为",20);
        final JButton jb=new JButton("清除");
        cp.add(jt);
        cp.add(jb);
        jt.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                // TODO 自动生成方法存根
                jt.setText("触发事件");
            }
        });
        jb.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                jt.setText("");
                jt.requestFocus();
            }
        });
        setVisible(true);
    }
    public static void main(String[] args) {
        new JTextFieldTest();
    }
}

运行结果:

文本域组件

  • Swing中任何一个文本域都是JTextArea类型的对象。常用构造方法如下:
public JTextArea();
public JTextArea(String text);
public JTextArea(int rows,int columns);
public JTextArea(Document doc);
public JTextArea(Document doc,String text,int rows,int columns);
  • 上述构造方法可以在初始化文本域时提供默认文本以及文本域的长与宽。
package com.lzw;

import java.awt.*;

import javax.swing.*;

public class JTextAreaTest extends JFrame{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    public JTextAreaTest(){
        setSize(200,100);
        setTitle("定义自动换行的文本域");
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        Container cp=getContentPane();
        JTextArea jt=new JTextArea("文本域",6,6);
        jt.setLineWrap(true);//可以自动换行
        cp.add(jt);
        setVisible(true);
    }
    public static void main(String[] args) {
        new JTextAreaTest();
    }
}

运行结果:

  • JTextArea类中存在一个setLineWrap()方法,该方法用于设置文本域是否可以自动换行,如果将该方法参数设置为ture,文本域将自动换行,否则不自动换行。

4. 常用事件监听器

  • 所谓事件监听器,实质上就是一个“实现特定类型监听器接口”的类对象。具体来说,事件几乎都以对象表示,它是某种事件类的对象,事件源会在用户做出相应的动作时产生事件对象,如动作事件对应ActionEvent类对象,同时要编写一个监听器的类必须实现相应的接口,如ActionEvent类对应的是ActionListener接口,需要获取某个事件对象就必须实现相应的接口,同时需要将接口中的方法一一实现。

动作事件监听器

  • 动作事件监听器是Swing中比较常用的事件监听器,很多组件的动作都会使用它监听,如按钮被单击。
package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class SimpleEvent extends JFrame{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private JButton jb=new JButton("我是按钮,单击我");
    public SimpleEvent(){
        setLayout(null);
        setSize(200,100);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        Container cp=getContentPane();
        cp.add(jb);
        jb.setBounds(10, 10,100,30);
        jb.addActionListener(new jbAction());
        setVisible(true);
    }
    class jbAction implements ActionListener{
        public void actionPerformed(ActionEvent arg0) {
            jb.setText("我被单击了");
        }
    }
    public static void main(String[] args) {
        new SimpleEvent();
    }
}

运行结果:

焦点事件监听器

  • 焦点事件监听器在实际项目开发中应用也比较广泛,如将光标焦点离开一个文本框时需要弹出一个对话框,或者将焦点返回给该文本框等。
package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class FocusEventTest extends JFrame{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    public FocusEventTest() {
        setSize(250,100);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container cp=getContentPane();
        getContentPane().setLayout(new FlowLayout());

        final JLabel label = new JLabel();
        getContentPane().add(label);
        JTextField jt=new JTextField("请单击其他文本框",10);
        JTextField jt2=new JTextField("请单击我",10);
        cp.add(jt);
        cp.add(jt2);
        jt.addFocusListener(new FocusListener(){
            //组件失去焦点时调用的方法
            public void focusLost(FocusEvent arg0) {
                JOptionPane.showMessageDialog(null, "文本框失去焦点");
            }
            //组件获取键盘焦点时调用的方法
            public void focusGained(FocusEvent arg0) {
            }
        });
        setVisible(true);
    }
    public static void main(String[] args) {
        new FocusEventTest();
    }

}

运行结果:

  • 在这个实例中,为文本框组件添加了焦点事件监听器。这个监听需要实现FocusListener接口。在该接口中定义了两个方法,分别为focusLost()和focusGained()方法,其中focusLost()方法是在组件失去焦点时调用的,而focusGained()方法是在组件获取焦点时调用的。由于本例需要实现文本失去焦点时弹出相应对话框功能,所以重写focusLost()方法,同时在为文本框添加监听时使用了匿名内部类的形式,将实现FocusListener接口对象传递给addFocusListener()方法。

你可能感兴趣的:(《JAVA:从入门到精通》part 16)