Java Swing 学习笔记

一、什么是Swing

swing是一个比较老的技术了,我觉得学习它还是很有必要的,也比较容易激发学习的兴趣。

Swing 是构建在 AWT(Abstract Window Toolkit)之上的轻量级 GUI 工具包,用于创建跨平台的图形用户界面。与 AWT 的重量级组件不同,Swing 组件是纯 Java 实现的,具有以下特点:

  1. 跨平台 :Swing 界面在不同操作系统上具有一致的外观和行为。

  2. 功能丰富 :提供了各种组件,如按钮、文本框、列表、菜单等,还支持设置外观、背景图像、边框、工具提示等功能。

  3. 灵活性高 :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.TimerpaintComponent 方法实现简单的动画效果。

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 的注意事项

  1. 性能问题 :由于 Swing 组件是纯 Java 实现的,可能会导致某些情况下性能较差,尤其是在高负载或资源受限的环境中。

  2. 组件过多 :Swing 提供了大量的组件,这可能会导致开发人员在选择组件时感到困惑,需要根据具体需求选择合适的组件。

  3. 事件处理代码冗长 :为组件添加事件监听器的代码可能会比较冗长,需要编写大量的匿名类或内部类来实现。

  4. 外观和风格限制 :Swing 的外观和风格可以通过 Look and Feel(外观管理器)进行定制,但仍然存在一定的限制,无法完全满足所有设计需求。

总之,Swing 是一个强大且灵活的 GUI 工具包,适用于开发跨平台的桌面应用程序。通过学习 Swing,可以掌握 Java 图形用户界面开发的基本原理和技巧,为开发各种桌面应用程序打下坚实的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值