96、Swing组件的探索与应用

Swing组件的探索与应用

1. 引言

在图形用户界面(GUI)编程中,Swing是Java提供的一组强大的组件库,用于创建丰富、交互性强的界面。本文将深入探讨Swing中的多种组件,包括文本框、按钮、复选框、单选按钮和选项卡面板等,并通过具体的代码示例展示它们的使用方法。

2. JTextField组件

2.1 概述

JTextField是Swing中最简单且最常用的文本组件,用于编辑单行文本。它继承自JTextComponent,使用Document接口作为其模型。

2.2 构造函数

构造函数 描述
JTextField(int cols) 创建一个指定列数的文本框
JTextField(String str, int cols) 创建一个包含初始文本和指定列数的文本框
JTextField(String str) 创建一个包含初始文本的文本框

2.3 事件处理

JTextField会根据用户的交互生成事件,例如按下回车键时会触发ActionEvent,光标位置改变时会触发CaretEvent。通常,我们可以通过调用getText()方法获取当前文本框中的文本。

2.4 示例代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
  <applet code="JTextFieldDemo" width=300 height=50>
  </applet>
*/

public class JTextFieldDemo extends JApplet {
  JTextField jtf;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    setLayout(new FlowLayout());
    jtf = new JTextField(15);
    add(jtf);
    jtf.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) {
        showStatus(jtf.getText());
      }
    });
  }
}

2.5 流程图

graph TD
    A[初始化] --> B[创建JTextField]
    B --> C[添加到内容面板]
    C --> D[添加ActionListener]
    D --> E[按下回车键]
    E --> F[显示文本]

3. Swing按钮组件

3.1 按钮类型

Swing定义了四种类型的按钮:JButton、JToggleButton、JCheckBox和JRadioButton,它们都是AbstractButton类的子类,共享一组共同的特性。

3.2 AbstractButton方法

方法 描述
setDisabledIcon(Icon di) 设置按钮禁用时显示的图标
setPressedIcon(Icon pi) 设置按钮按下时显示的图标
setSelectedIcon(Icon si) 设置按钮选中时显示的图标
setRolloverIcon(Icon ri) 设置鼠标悬停在按钮上时显示的图标
getText() 获取按钮关联的文本
setText(String str) 设置按钮关联的文本

3.3 JButton

3.3.1 概述

JButton提供了普通按钮的功能,可以关联图标、字符串或两者同时关联。

3.3.2 构造函数
构造函数 描述
JButton(Icon icon) 创建一个包含图标的按钮
JButton(String str) 创建一个包含文本的按钮
JButton(String str, Icon icon) 创建一个包含文本和图标的按钮
3.3.3 示例代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
  <applet code="JButtonDemo" width=250 height=750>
  </applet>
*/

public class JButtonDemo extends JApplet implements ActionListener {
  JLabel jlab;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    setLayout(new FlowLayout());
    ImageIcon hourglass = new ImageIcon("hourglass.png");
    JButton jb = new JButton(hourglass);
    jb.setActionCommand("Hourglass");
    jb.addActionListener(this);
    add(jb);
    ImageIcon analog = new ImageIcon("analog.png");
    jb = new JButton(analog);
    jb.setActionCommand("Analog Clock");
    jb.addActionListener(this);
    add(jb);
    ImageIcon digital = new ImageIcon("digital.png");
    jb = new JButton(digital);
    jb.setActionCommand("Digital Clock");
    jb.addActionListener(this);
    add(jb);
    ImageIcon stopwatch = new ImageIcon("stopwatch.png");
    jb = new JButton(stopwatch);
    jb.setActionCommand("Stopwatch");
    jb.addActionListener(this);
    add(jb);
    jlab = new JLabel("Choose a Timepiece");
    add(jlab);
  }

  public void actionPerformed(ActionEvent ae) {
    jlab.setText("You selected " + ae.getActionCommand());
  }
}

3.4 JToggleButton

3.4.1 概述

JToggleButton是一种切换按钮,有按下和释放两种状态。每次按下时,它会在两种状态之间切换。

3.4.2 构造函数
构造函数 描述
JToggleButton(String str) 创建一个包含指定文本的切换按钮
3.4.3 事件处理

JToggleButton每次按下时会生成ActionEvent,同时还会生成ItemEvent。可以通过实现ItemListener接口来处理ItemEvent。

3.4.4 示例代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
  <applet code="JToggleButtonDemo" width=200 height=80>
  </applet>
*/

public class JToggleButtonDemo extends JApplet {
  JLabel jlab;
  JToggleButton jtbn;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    setLayout(new FlowLayout());
    jlab = new JLabel("Button is off.");
    jtbn = new JToggleButton("On/Off");
    jtbn.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent ie) {
        if(jtbn.isSelected())
          jlab.setText("Button is on.");
        else
          jlab.setText("Button is off.");
      }
    });
    add(jtbn);
    add(jlab);
  }
}

4. 复选框与单选按钮

4.1 复选框(JCheckBox)

4.1.1 概述

JCheckBox 提供了复选框的功能,它继承自 JToggleButton,支持两种状态的按钮。

4.1.2 构造函数
构造函数 描述
JCheckBox(String str) 创建一个带有指定文本标签的复选框
4.1.3 事件处理

当用户选择或取消选择复选框时,会生成 ItemEvent。可以通过实现 ItemListener 接口,在 itemStateChanged() 方法中调用 getItem() 方法获取生成事件的 JCheckBox 实例,再调用 isSelected() 方法确定其状态。

4.1.4 示例代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/*
  <applet code="JCheckBoxDemo" width=270 height=50>
  </applet>
*/

public class JCheckBoxDemo extends JApplet implements ItemListener {
  JLabel jlab;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    setLayout(new FlowLayout());
    JCheckBox cb = new JCheckBox("C");
    cb.addItemListener(this);
    add(cb);
    cb = new JCheckBox("C++");
    cb.addItemListener(this);
    add(cb);
    cb = new JCheckBox("Java");
    cb.addItemListener(this);
    add(cb);
    cb = new JCheckBox("Perl");
    cb.addItemListener(this);
    add(cb);
    jlab = new JLabel("Select languages");
    add(jlab);
  }

  public void itemStateChanged(ItemEvent ie) {
    JCheckBox cb = (JCheckBox)ie.getItem();
    if(cb.isSelected())
      jlab.setText(cb.getText() + " is selected");
    else
      jlab.setText(cb.getText() + " is cleared");
  }
}

4.2 单选按钮(JRadioButton)

4.2.1 概述

单选按钮是一组互斥的按钮,同一时间只能选择一个。JRadioButton 继承自 JToggleButton。

4.2.2 构造函数
构造函数 描述
JRadioButton(String str) 创建一个带有指定标签的单选按钮
4.2.3 按钮组配置

为了实现互斥选择,需要将单选按钮配置到一个组中。使用 ButtonGroup 类创建按钮组,通过 add(AbstractButton ab) 方法将按钮添加到组中。

4.2.4 事件处理

JRadioButton 会在按钮选择改变时生成 ActionEvent、ItemEvent 和 ChangeEvent,通常处理 ActionEvent,实现 ActionListener 接口。在 actionPerformed() 方法中,可以通过多种方式确定哪个按钮被选中,如调用 getActionCommand() getSource() isSelected() 方法。

4.2.5 示例代码
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 {
  JLabel jlab;

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    setLayout(new FlowLayout());
    JRadioButton b1 = new JRadioButton("A");
    b1.addActionListener(this);
    add(b1);
    JRadioButton b2 = new JRadioButton("B");
    b2.addActionListener(this);
    add(b2);
    JRadioButton b3 = new JRadioButton("C");
    b3.addActionListener(this);
    add(b3);
    ButtonGroup bg = new ButtonGroup();
    bg.add(b1);
    bg.add(b2);
    bg.add(b3);
    jlab = new JLabel("Select One");
    add(jlab);
  }

  public void actionPerformed(ActionEvent ae) {
    jlab.setText("You selected " + ae.getActionCommand());
  }
}

4.3 单选按钮事件处理流程图

graph TD
    A[创建单选按钮] --> B[添加到按钮组]
    B --> C[添加ActionListener]
    C --> D[按钮选择改变]
    D --> E[触发actionPerformed方法]
    E --> F[确定选中按钮]
    F --> G[更新标签文本]

5. 选项卡面板(JTabbedPane)

5.1 概述

JTabbedPane 封装了一个选项卡面板,通过将组件与选项卡关联来管理一组组件。选择一个选项卡会使与之关联的组件显示在最前面。

5.2 构造函数

构造函数 描述
JTabbedPane() 创建一个空的选项卡面板,选项卡位于面板顶部

5.3 添加选项卡

通过调用 addTab(String name, Component comp) 方法添加选项卡,其中 name 是选项卡的名称, comp 是要添加到选项卡的组件,通常是包含一组相关组件的 JPanel。

5.4 使用步骤

  1. 创建 JTabbedPane 实例。
  2. 调用 addTab() 方法添加每个选项卡。
  3. 将选项卡面板添加到内容面板。

5.5 示例代码

import javax.swing.*;
/*
  <applet code="JTabbedPaneDemo" width=400 height=100>
  </applet>
*/

public class JTabbedPaneDemo extends JApplet {

  public void init() {
    try {
      SwingUtilities.invokeAndWait(
        new Runnable() {
          public void run() {
            makeGUI();
          }
        }
      );
    } catch (Exception exc) {
      System.out.println("Can't create because of " + exc);
    }
  }

  private void makeGUI() {
    JTabbedPane jtp = new JTabbedPane();
    jtp.addTab("Cities", new CitiesPanel());
    jtp.addTab("Colors", new ColorsPanel());
    jtp.addTab("Flavors", new FlavorsPanel());
    add(jtp);
  }
}

class CitiesPanel extends JPanel {
  public CitiesPanel() {
    JButton b1 = new JButton("New York");
    add(b1);
    JButton b2 = new JButton("London");
    add(b2);
    JButton b3 = new JButton("Hong Kong");
    add(b3);
    JButton b4 = new JButton("Tokyo");
    add(b4);
  }
}

class ColorsPanel extends JPanel {
  public ColorsPanel() {
    JCheckBox cb1 = new JCheckBox("Red");
    add(cb1);
    JCheckBox cb2 = new JCheckBox("Green");
    add(cb2);
    JCheckBox cb3 = new JCheckBox("Blue");
    add(cb3);
  }
}

class FlavorsPanel extends JPanel {
  public FlavorsPanel() {
    JComboBox<String> jcb = new JComboBox<String>();
    jcb.addItem("Vanilla");
    jcb.addItem("Chocolate");
    jcb.addItem("Strawberry");
    add(jcb);
  }
}

5.6 选项卡面板使用流程图

graph TD
    A[创建JTabbedPane实例] --> B[添加选项卡]
    B --> C[将选项卡面板添加到内容面板]

综上所述,Swing 提供了丰富的组件来创建功能强大的图形用户界面。通过合理使用这些组件,结合事件处理机制,可以开发出交互性强、用户体验好的应用程序。无论是简单的文本输入,还是复杂的选项卡管理,Swing 都能满足需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值