《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<String> 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<String> implements ComboBoxModel<String> {
    /**
     *
     */
    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<String> 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<String> {
    /**
     *
     */
    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()方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • java是面向过程的编程语言:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越...
    Java小辰阅读 3,044评论 0 17
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,046评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,217评论 0 2
  • Java学习笔记之Swing(三) Swing中的常用控件 你将学到: 了解如何创建文本框和文本框的实际应用; 了...
    Felix_Smile阅读 1,051评论 0 6
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,373评论 0 17