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 使用步骤
- 创建 JTabbedPane 实例。
-
调用
addTab()方法添加每个选项卡。 - 将选项卡面板添加到内容面板。
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 都能满足需求。
超级会员免费看
71

被折叠的 条评论
为什么被折叠?



