一、什么是Swing
swing是一个比较老的技术了,我觉得学习它还是很有必要的,也比较容易激发学习的兴趣。
Swing 是构建在 AWT(Abstract Window Toolkit)之上的轻量级 GUI 工具包,用于创建跨平台的图形用户界面。与 AWT 的重量级组件不同,Swing 组件是纯 Java 实现的,具有以下特点:
-
跨平台 :Swing 界面在不同操作系统上具有一致的外观和行为。
-
功能丰富 :提供了各种组件,如按钮、文本框、列表、菜单等,还支持设置外观、背景图像、边框、工具提示等功能。
-
灵活性高 :Swing 组件可以自定义,通过为组件的特定事件(如单击、鼠标移动等)定义事件处理器来添加交互功能。
二、Swing组件
1. 常用组件
-
JButton :按钮组件,用于触发操作。
-
JLabel :标签组件,用于显示文本或图像。
-
JTextField :单行文本输入框。
-
JTextArea :多行文本输入框。
-
JComboBox :下拉列表框,用于选择一个选项。
-
JList :列表框,用于选择多个选项。
-
JCheckBox :复选框,用于选择多个选项。
-
JRadioButton :单选按钮,用于选择一个选项。
-
JScrollPane :滚动面板,用于在小空间内显示大量内容。
-
JMenuBar 和 JMenu :菜单栏和菜单组件。
2. 示例代码
1. JButton
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JButtonExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("JButton Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个 JButton
JButton button = new JButton("Click Me!");
// 为按钮添加点击事件监听器
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Button clicked!");
}
});
// 将按钮添加到窗口中
frame.getContentPane().add(button);
// 显示窗口
frame.setVisible(true);
}
}
2. JTextField
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextFieldExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("JTextField Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个 JTextArea
JTextField textField = new JTextField(20);
// 创建一个 JButton
JButton button = new JButton("Show Text");
// 为按钮添加点击事件监听器
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(frame, "Text: " + textField.getText());
}
});
// 创建一个 JPanel,并将组件添加到面板中
JPanel panel = new JPanel();
panel.add(textField);
panel.add(button);
// 将面板添加到窗口中
frame.getContentPane().add(panel);
// 显示窗口
frame.setVisible(true);
}
}
三、布局管理器
Swing 提供了多种布局管理器,用于控制组件在容器中的排列方式。
1. FlowLayout
FlowLayout
是默认的布局管理器,它将组件从左到右排列,根据需要换行。
import javax.swing.*;
import java.awt.*;
public class FlowLayoutExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("FlowLayout Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置布局管理器为 FlowLayout
frame.setLayout(new FlowLayout());
// 添加组件
frame.add(new JButton("Button 1"));
frame.add(new JButton("Button 2"));
frame.add(new JButton("Button 3"));
// 显示窗口
frame.setVisible(true);
}
}
2. BorderLayout
BorderLayout
是用于将组件放置在容器的五个区域之一:北、南、东、西、中。
import javax.swing.*;
import java.awt.*;
public class BorderLayoutExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("BorderLayout Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置布局管理器为 BorderLayout
frame.setLayout(new BorderLayout());
// 添加组件到不同的区域
frame.add(new JButton("North"), BorderLayout.NORTH);
frame.add(new JButton("South"), BorderLayout.SOUTH);
frame.add(new JButton("East"), BorderLayout.EAST);
frame.add(new JButton("West"), BorderLayout.WEST);
frame.add(new JButton("Center"), BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
}
}
四、事件处理
Swing 构件可以通过事件监听器来实现交互功能。
1. 鼠标事件
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MouseListenerExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("MouseListener Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个 JLabel
JLabel label = new JLabel("Mouse not pressed");
// 为标签添加鼠标事件监听器
label.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
label.setText("Mouse clicked at (" + e.getX() + ", " + e.getY() + ")");
}
public void mousePressed(MouseEvent e) {
label.setText("Mouse pressed at (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseReleased(MouseEvent e) {
label.setText("Mouse released at (" + e.getX() + ", " + e.getY() + ")");
}
public void mouseEntered(MouseEvent e) {
label.setText("Mouse entered");
}
public void mouseExited(MouseEvent e) {
label.setText("Mouse exited");
}
});
// 将标签添加到窗口中
frame.getContentPane().add(label);
// 显示窗口
frame.setVisible(true);
}
}
2. 键盘事件
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyListenerExample {
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("KeyListener Example");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建一个 JTextArea
JTextArea textArea = new JTextArea();
// 为文本区域添加键盘事件监听器
textArea.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
System.out.println("Key typed: " + e.getKeyChar());
}
public void keyPressed(KeyEvent e) {
System.out.println("Key pressed: " + e.getKeyChar());
}
public void keyReleased(KeyEvent e) {
System.out.println("Key released: " + e.getKeyChar());
}
});
// 将文本区域添加到窗口中
frame.getContentPane().add(new JScrollPane(textArea));
// 显示窗口
frame.setVisible(true);
}
}
五、Swing 动画
Swing 可以通过 javax.swing.Timer
和 paintComponent
方法实现简单的动画效果。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleAnimation extends JPanel {
private int x = 0;
private int y = 0;
public SimpleAnimation() {
// 创建一个 Timer,并设置每 10 毫秒触发一次事件
Timer timer = new Timer(10, new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 更新坐标
x++;
y++;
// 重新绘制面板
repaint();
}
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制一个圆
g.setColor(Color.RED);
g.fillOval(x, y, 20, 20);
}
public static void main(String[] args) {
// 创建一个 JFrame 窗口
JFrame frame = new JFrame("Simple Animation");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 添加动画面板
frame.getContentPane().add(new SimpleAnimation());
// 显示窗口
frame.setVisible(true);
}
}
六、Swing 的特点和用途
1. 特点
-
跨平台 :Swing 界面在不同操作系统上具有一致的外观和行为。
-
功能丰富 :提供了各种组件,如按钮、文本框、列表、菜单等,还支持设置外观、背景图像、边框、工具提示等功能。
-
灵活性高 :Swing 组件可以自定义,通过为组件的特定事件(如单击、鼠标移动等)定义事件处理器来添加交互功能。
-
支持 MVC 模式 :Swing 支持模型 - 视图 - 控制器(MVC)模式,可以将用户界面的逻辑与数据分开。
2. 用途
-
开发桌面应用程序 :Swing 可以用于开发各种桌面应用程序,如办公软件、图形编辑器、游戏等。
-
创建图形用户界面 :Swing 提供了丰富的组件和布局管理器,可以创建复杂的图形用户界面。
-
实现交互功能 :通过事件监听器,可以为 Swing 组件添加交互功能,如按钮点击、鼠标移动、键盘输入等。
七、Swing 的注意事项
-
性能问题 :由于 Swing 组件是纯 Java 实现的,可能会导致某些情况下性能较差,尤其是在高负载或资源受限的环境中。
-
组件过多 :Swing 提供了大量的组件,这可能会导致开发人员在选择组件时感到困惑,需要根据具体需求选择合适的组件。
-
事件处理代码冗长 :为组件添加事件监听器的代码可能会比较冗长,需要编写大量的匿名类或内部类来实现。
-
外观和风格限制 :Swing 的外观和风格可以通过 Look and Feel(外观管理器)进行定制,但仍然存在一定的限制,无法完全满足所有设计需求。
总之,Swing 是一个强大且灵活的 GUI 工具包,适用于开发跨平台的桌面应用程序。通过学习 Swing,可以掌握 Java 图形用户界面开发的基本原理和技巧,为开发各种桌面应用程序打下坚实的基础。