Java创建图形化界面

Java创建图形化界面

一、swing

Swing 的核心是 "组件 (Component)" 和 "容器 (Container)":

  • 组件:按钮、文本框、标签等可以和用户交互的元素
  • 容器:用来存放组件的地方(如窗口、面板)

所有 Swing 组件都以J开头(如 JFrameJButton

二、JFrame

JFramejava的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。

创建窗口

JFrame frame = new JFrame();

  • JFrame()构造一个最初不可见的新框架。
  • JFrame(GraphicsConfiguration gc)在屏幕设备的指定 GraphicsConfiguration 和空白标题中创建一个 Frame
  • JFrame(String title)创建一个具有指定标题的新的、最初不可见的 Frame。
  • JFrame(String title, GraphicsConfiguration gc)创建具有指定标题和屏幕设备的指定 GraphicsConfigurationJFrame

常用方法

方法名 作用
setTitle(String title) 设置窗口标题
setSize(int width, int height) 设置窗口大小(宽、高)
setLocation(int x, int y) 设置窗口在屏幕上的位置(坐标)
setLocationRelativeTo(null) 让窗口居中显示(相对于屏幕)
setResizable(boolean resizable) 设置窗口是否可调整大小(默认 true
setDefaultCloseOperation(int operation) 设置窗口关闭行为(如 EXIT_ON_CLOSE
add(Component comp) 向窗口添加组件(如按钮、文本框)
setVisible(boolean visible) 设置窗口是否可见(默认 false
setIconImage(Image image) 设置窗口标题栏的图标
  • 设置标题frame.setTitle(String title);
  • 设置窗口大小frame.setSize(int width, int height);
  • 设置窗口在屏幕上的位置:setLocation(int x, int y);
  • 让窗口居中显示:setLocationRelativeTo(null);
  • 设置窗口是否可调整大小(默认 true:setResizable(boolean resizable)
  • 设置关闭窗口时的行为:frame.setDefaultCloseOperation(int operation),这个参数一般是传入定义的常量名;
    • JFrame.DO_NOTHING_ON_CLOSE==0
      关闭窗口时不执行任何操作。此时点击关闭按钮不会有任何反应,通常需要配合 WindowListener 监听器来自定义关闭逻辑,例如弹出确认对话框询问用户是否真的要关闭窗口。
    • JFrame.HIDE_ON_CLOSE==1
      关闭窗口时仅隐藏窗口(窗口仍然存在于内存中,并未被销毁)。之后可以通过调用 setVisible(true) 方法重新显示该窗口。这是 Swing 早期版本的默认行为。
    • JFrame.DISPOSE_ON_CLOSE==2
      关闭当前窗口并释放该窗口所占用的资源(销毁窗口),但不会退出整个应用程序。如果应用程序中还有其他窗口处于打开状态,程序会继续运行。
    • JFrame.EXIT_ON_CLOSE==3
      关闭窗口时退出整个应用程序,会终止 Java 虚拟机(JVM)的运行。这是大多数主窗口常用的关闭行为,确保关闭主窗口时能完全退出程序。
  • 向窗口添加组件:add(Component comp);
  • 设置窗口是否可见(默认 false:setVisible(boolean visible);
  • 设置窗口标题栏的图标:setIconImage(Image image);

简要代码实现

import javax.swing.JFrame;

public class FirstWindow {
    public static void main(String[] args) {
        // 1. 创建窗口对象
        JFrame frame = new JFrame("我的第一个窗口");
        
        // 2. 设置窗口大小(宽度, 高度)
        frame.setSize(400, 300);
        
        // 3. 设置关闭窗口时的操作(退出程序)
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 4. 设置窗口居中显示
        frame.setLocationRelativeTo(null);
        
        // 5. 显示窗口
        frame.setVisible(true);
    }
}

三、JPanel

JPanel – 是 Java Swing 中的轻量级面板容器,用于组织和管理其他 Swing 组件(如按钮、文本框等),不能独立存在,必须嵌套在 JFrame 等顶级容器中使用,是构建复杂界面的基础组件。

创建面板

JPanel panel = new JPanel();

JPanel 提供了两个主要构造方法:

  • JPanel() 构造一个默认配置的面板,默认使用 FlowLayout 布局管理器(组件按添加顺序从左到右排列,一行排满自动换行)。
  • JPanel(LayoutManager layout) 构造一个使用指定布局管理器的面板,可直接设置为 BorderLayoutGridLayout 等布局方式。

常用方法

方法名 作用
add(Component comp) 向面板中添加组件(如按钮、文本框)
setLayout(LayoutManager mgr) 设置面板的布局管理器
setBackground(Color c) 设置面板的背景颜色(默认透明)
setPreferredSize(Dimension d) 设置面板的首选大小(宽 × 高)
setBorder(Border border) 为面板设置边框(如空白边框、线条边框)
remove(Component comp) 从面板中移除指定组件
removeAll() 移除面板中所有组件
revalidate() 重新计算布局(组件变化后刷新界面)
repaint() 重绘面板(使界面变化立即生效)
  • 添加组件panel.add(new JButton("确定")); 向面板添加按钮组件。
  • 设置布局panel.setLayout(new GridLayout(2, 2)); 将面板布局设为 2 行 2 列的网格。
  • 设置背景panel.setBackground(Color.LIGHT_GRAY); 将面板背景设为浅灰色(默认透明)。
  • 设置边框panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 为面板添加 10 像素的内边距。
  • 移除组件panel.remove(button); 移除指定组件;panel.removeAll(); 清空面板所有组件(需配合 revalidate()repaint() 刷新)。

布局管理器搭配使用

JPanel 的核心价值在于结合不同布局管理器实现复杂界面,常见组合方式:

  1. BorderLayout 中嵌套 GridLayout
    主窗口用 BorderLayout,中间区域放一个 GridLayout 面板,实现网格布局的表单。

  2. 多层面板嵌套
    面板中再放面板,每层使用不同布局,例如:

    // 外层面板(流式布局)
    JPanel outerPanel = new JPanel();
    // 内层面板(网格布局)
    JPanel innerPanel = new JPanel(new GridLayout(3, 1));
    innerPanel.add(new JLabel("用户名"));
    innerPanel.add(new JTextField(10));
    outerPanel.add(innerPanel); // 内层面板作为组件添加到外层
    

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JPanelDemo {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("面板综合示例");
        frame.setSize(500, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建主面板(边界布局)
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); // 外边框
        
        // 3. 创建顶部面板(流式布局,放标题)
        JPanel topPanel = new JPanel();
        JLabel titleLabel = new JLabel("用户注册");
        titleLabel.setFont(new Font("黑体", Font.BOLD, 18));
        topPanel.add(titleLabel);
        
        // 4. 创建中间面板(网格布局,放表单)
        JPanel formPanel = new JPanel(new GridLayout(3, 2, 5, 10));
        formPanel.add(new JLabel("用户名:"));
        formPanel.add(new JTextField(15));
        formPanel.add(new JLabel("密码:"));
        formPanel.add(new JPasswordField(15));
        formPanel.add(new JLabel("邮箱:"));
        formPanel.add(new JTextField(15));
        
        // 5. 创建底部面板(流式布局,放按钮)
        JPanel bottomPanel = new JPanel();
        JButton submitBtn = new JButton("提交");
        JButton resetBtn = new JButton("重置");
        bottomPanel.add(submitBtn);
        bottomPanel.add(resetBtn);
        
        // 6. 组装面板到主面板
        mainPanel.add(topPanel, BorderLayout.NORTH);
        mainPanel.add(formPanel, BorderLayout.CENTER);
        mainPanel.add(bottomPanel, BorderLayout.SOUTH);
        
        // 7. 添加主面板到窗口并显示
        frame.add(mainPanel);
        frame.setVisible(true);
    }
}

注意事项

  • 布局嵌套原则:复杂界面建议通过多层面板嵌套实现,每层专注于单一布局逻辑,避免单层布局过于复杂。
  • 刷新机制:动态添加 / 移除组件后,必须调用 revalidate()(重新计算布局)和 repaint()(重绘)才能让变化生效。
  • 背景透明JPanel 默认透明,设置 setBackground() 后才会显示背景色,便于区分不同功能区域。

JPanel 是界面布局的 "积木",通过灵活组合面板和布局管理器,可构建出结构清晰、美观易用的 Swing 界面。

四、JLabel

JLabel对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐。默认情况下,标签在其显示区内垂直居中对齐。默认情况下,只显示文本的标签是开始边对齐;而只显示图像的标签则水平居中对齐。

创建标签

JLabel label = new JLabel();

JLabel 提供了多个构造方法,用于创建不同初始状态的标签:

  • JLabel() 构造一个无文本、无图像的空标签。
  • JLabel(String text) 构造一个显示指定文本的标签(文本默认左对齐)。
  • JLabel(Icon image) 构造一个显示指定图像的标签。
  • JLabel(String text, Icon icon, int horizontalAlignment) 构造一个同时显示文本和图像的标签,并指定水平对齐方式(如左对齐、居中、右对齐)。

常用方法

方法名 作用
setText(String text) 设置标签显示的文本内容
getText() 获取标签当前显示的文本内容
setIcon(Icon icon) 设置标签显示的图像(如 ImageIcon
setHorizontalAlignment(int alignment) 设置文本 / 图像的水平对齐方式(如居中)
setFont(Font font) 设置标签文本的字体(样式、大小等)
setForeground(Color c) 设置标签文本的颜色
setToolTipText(String text) 设置鼠标悬停在标签上时显示的提示文本
  • 设置 / 获取文本label.setText("用户名:"); 设置文本;String text = label.getText(); 获取文本。
  • 设置图像label.setIcon(new ImageIcon("logo.png")); 显示本地图片(需指定正确路径)。
  • 水平对齐label.setHorizontalAlignment(SwingConstants.CENTER); 设置为居中对齐(可选值:LEFT 左对齐、CENTER 居中、RIGHT 右对齐)。
  • 设置字体label.setFont(new Font("宋体", Font.BOLD, 16)); 设置为宋体、粗体、16 号字。
  • 设置文本颜色label.setForeground(Color.RED); 将文本设置为红色。

简要代码实现

import javax.swing.*;
import java.awt.*;

public class FirstLabel {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("标签示例");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建面板(使用流式布局)
        JPanel panel = new JPanel();
        panel.setBackground(Color.WHITE);
        
        // 3. 创建并配置标签
        // 标签1:显示文本,右对齐
        JLabel label1 = new JLabel("用户名:", SwingConstants.RIGHT);
        label1.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 设置字体
        
        // 标签2:显示文本+图像(假设存在"user.png"图片)
        JLabel label2 = new JLabel("用户信息", new ImageIcon("user.png"), SwingConstants.LEFT);
        label2.setForeground(new Color(0, 100, 200)); // 设置文本颜色
        label2.setToolTipText("这是用户信息标签"); // 鼠标悬停提示
        
        // 4. 向面板添加标签和文本框(用于演示标签的标识作用)
        panel.add(label1);
        panel.add(new JTextField(15));
        panel.add(new JSeparator(SwingConstants.VERTICAL)); // 垂直分隔线
        panel.add(label2);
        
        // 5. 将面板添加到窗口
        frame.add(panel);
        
        // 6. 显示窗口
        frame.setVisible(true);
    }
}

注意事项

  • JLabel 是静态展示组件,默认不响应鼠标或键盘事件,若需交互需配合监听器。
  • 显示图像时,ImageIcon 构造方法需传入正确的图片路径(绝对路径或项目相对路径),若图片不存在则不显示任何内容。
  • 水平对齐方式对布局有影响,例如右对齐的标签会在其占用的空间内靠右显示,便于与左侧组件对齐。

JLabel 是界面中最基础的组件之一,通过合理设置文本、图像和样式,可提升界面的可读性和美观度。

五、JTextField

JTextField – 是 Java Swing 中的文本输入框组件,允许用户输入和编辑单行文本,常用于获取用户输入(如用户名、密码片段、搜索关键词等)。

创建文本框

JTextField textField = new JTextField();

JTextField 提供了多个构造方法,用于创建不同初始状态的文本框:

  • JTextField() 构造一个空的文本框,默认宽度由布局管理器决定。
  • JTextField(int columns) 构造一个指定列数的文本框(columns 表示可显示的字符数,影响文本框宽度)。
  • JTextField(String text) 构造一个包含初始文本的文本框。
  • JTextField(String text, int columns) 构造一个包含初始文本且指定列数的文本框。

常用方法

方法名 作用
setText(String text) 设置文本框中的内容
getText() 获取文本框中的当前内容
setColumns(int columns) 设置文本框的列数(影响宽度)
setEditable(boolean editable) 设置文本框是否可编辑(true 可编辑,false 只读)
setHorizontalAlignment(int alignment) 设置文本的水平对齐方式(左对齐、居中、右对齐)
setFont(Font font) 设置文本框内文字的字体
setForeground(Color c) 设置文本颜色
setBackground(Color c) 设置文本框的背景颜色
setToolTipText(String text) 设置鼠标悬停时显示的提示文本
addActionListener(ActionListener l) 为文本框添加动作监听器(如按回车触发)
  • 设置 / 获取文本textField.setText("默认值"); 设置初始文本;String input = textField.getText(); 获取用户输入。
  • 控制编辑权限textField.setEditable(false); 设置为只读模式(用户无法修改内容)。
  • 文本对齐textField.setHorizontalAlignment(SwingConstants.RIGHT); 设置文本右对齐(适合显示数字)。
  • 响应回车事件:通过 addActionListener 监听回车动作,例如用户输入后按回车提交内容。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FirstTextField {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("文本框示例");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建面板(使用网格布局:2行2列,间距5像素)
        JPanel panel = new JPanel(new GridLayout(2, 2, 5, 10));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // 面板边距
        
        // 3. 创建组件
        JLabel label = new JLabel("请输入内容:");
        JTextField textField = new JTextField(15); // 15列宽的文本框
        JButton btn = new JButton("获取内容");
        JLabel resultLabel = new JLabel("结果将显示在这里");
        
        // 4. 配置文本框
        textField.setToolTipText("输入后按回车或点击按钮提交");
        textField.setFont(new Font("宋体", Font.PLAIN, 14));
        
        // 5. 为文本框添加回车事件监听
        textField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String input = textField.getText();
                resultLabel.setText("你输入了:" + input);
            }
        });
        
        // 6. 为按钮添加点击事件(与回车效果一致)
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String input = textField.getText();
                resultLabel.setText("你输入了:" + input);
            }
        });
        
        // 7. 添加组件到面板
        panel.add(label);
        panel.add(textField);
        panel.add(btn);
        panel.add(resultLabel);
        
        // 8. 将面板添加到窗口
        frame.add(panel);
        
        // 9. 显示窗口
        frame.setVisible(true);
    }
}

注意事项

  • JTextField 仅支持单行文本输入,若需多行输入需使用 JTextArea
  • 获取文本前建议判断内容合法性(如非空校验),避免空指针异常。
  • 若需隐藏输入内容(如密码),应使用 JPasswordField(继承自 JTextField,输入内容显示为圆点或星号)。

JTextField 是交互性很强的组件,通过与监听器结合,可实现实时验证、提交表单等功能,是数据输入的核心组件。

六、JTextArea

JTextArea – 是 Java Swing 中的多行文本区域组件,允许用户输入和编辑多行文本,支持自动换行,常用于需要大量文本输入或显示的场景(如备注信息、文本编辑器、日志显示等)。

创建文本区域

JTextArea textArea = new JTextArea();

JTextArea 提供了多个构造方法,用于创建不同初始状态的文本区域:

  • JTextArea() 构造一个空的文本区域,默认行数和列数由布局管理器决定。
  • JTextArea(int rows, int columns) 构造一个指定行数和列数的文本区域(rows 行数,columns 每行可显示的字符数)。
  • JTextArea(String text) 构造一个包含初始文本的文本区域。
  • JTextArea(String text, int rows, int columns) 构造一个包含初始文本且指定行列数的文本区域。

常用方法

方法名 作用
setText(String text) 设置文本区域中的内容
getText() 获取文本区域中的所有内容
append(String str) 向文本区域末尾追加内容
setRows(int rows) 设置文本区域的行数
setColumns(int columns) 设置文本区域的列数(影响宽度)
setLineWrap(boolean wrap) 设置是否自动换行(true 自动换行)
setWrapStyleWord(boolean word) 设置换行方式(true 按单词边界换行,更美观)
setEditable(boolean editable) 设置是否可编辑(false 为只读模式)
setFont(Font font) 设置文本字体
setForeground(Color c) 设置文本颜色
setBackground(Color c) 设置背景颜色
getDocument().getLength() 获取文本长度(字符数)
selectAll() 选中所有文本
replaceRange(String str, int start, int end) 替换指定范围的文本(从startend索引)
  • 自动换行设置textArea.setLineWrap(true); 开启自动换行;textArea.setWrapStyleWord(true); 按单词换行(避免单词被截断)。
  • 追加内容textArea.append("新内容\n"); 向现有文本末尾添加内容(\n 表示换行)。
  • 清空内容textArea.setText(""); 清除文本区域中的所有内容。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FirstTextArea {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("文本区域示例");
        frame.setSize(500, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建面板(使用边界布局)
        JPanel panel = new JPanel(new BorderLayout());
        
        // 3. 创建文本区域(5行,30列)
        JTextArea textArea = new JTextArea(5, 30);
        textArea.setLineWrap(true); // 自动换行
        textArea.setWrapStyleWord(true); // 按单词换行
        textArea.setFont(new Font("宋体", Font.PLAIN, 14));
        textArea.setBorder(BorderFactory.createTitledBorder("请输入内容")); // 带标题的边框
        
        // 4. 为文本区域添加滚动条(当内容超出大小时自动显示)
        JScrollPane scrollPane = new JScrollPane(textArea);
        
        // 5. 创建按钮面板
        JPanel btnPanel = new JPanel();
        JButton appendBtn = new JButton("追加内容");
        JButton clearBtn = new JButton("清空");
        JButton getBtn = new JButton("获取内容");
        
        // 6. 按钮事件处理
        appendBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.append("这是追加的新内容...\n");
            }
        });
        
        clearBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setText(""); // 清空文本
            }
        });
        
        getBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String content = textArea.getText();
                // 显示获取的内容(通过对话框)
                JOptionPane.showMessageDialog(frame, 
                    "文本内容:\n" + content, 
                    "提示", 
                    JOptionPane.INFORMATION_MESSAGE);
            }
        });
        
        // 7. 组装组件
        btnPanel.add(appendBtn);
        btnPanel.add(clearBtn);
        btnPanel.add(getBtn);
        
        panel.add(scrollPane, BorderLayout.CENTER); // 文本区域放中间
        panel.add(btnPanel, BorderLayout.SOUTH); // 按钮放底部
        
        // 8. 添加到窗口并显示
        frame.add(panel);
        frame.setVisible(true);
    }
}

注意事项

  1. 滚动条JTextArea 本身不自带滚动条,通常需要将其放入 JScrollPane 中(如示例),当内容超出可视区域时会自动显示滚动条。
  2. 换行符:不同操作系统的换行符可能不同(Windows 用 \r\n,Linux 用 \n),但 JTextArea 会自动处理,直接使用 \n 即可。
  3. 性能:对于超大文本(如几万行),建议使用 JTextPaneJEditorPane 替代,它们对大文本的处理更高效。
  4. 监听文本变化:可通过 DocumentListener 监听文本内容的实时变化,用于实时校验或字数统计。

JTextArea 是处理多行文本的核心组件,结合滚动条和事件监听,可实现功能丰富的文本编辑或显示功能。

七、JPasswordField

JPasswordField – 是 Java Swing 中的密码输入框组件,继承自 JTextField,专门用于输入密码等敏感信息。其特点是输入的文本会被特殊字符(如星号 * 或圆点 )掩盖,保护信息安全。

创建密码框

JPasswordField pwdField = new JPasswordField();

JPasswordField 提供了与 JTextField 类似的构造方法:

  • JPasswordField() 构造一个空的密码框,默认宽度由布局管理器决定。
  • JPasswordField(int columns) 构造一个指定列数的密码框(columns 影响宽度)。
  • JPasswordField(String text) 构造一个包含初始文本的密码框(不常用,密码一般不预设)。
  • JPasswordField(String text, int columns) 构造包含初始文本且指定列数的密码框。

常用方法

方法名 作用
getPassword() 获取密码框中的密码(返回 char[] 数组,推荐使用)
setText(String text) 设置密码框中的内容(一般用于清空或预设)
setEchoChar(char c) 设置密码的掩盖字符(如 *# 等)
getEchoChar() 获取当前使用的掩盖字符
setColumns(int columns) 设置列数(影响宽度)
setEditable(boolean editable) 设置是否可编辑(false 为只读)
setHorizontalAlignment(int alignment) 设置文本水平对齐方式(如居中)
  • 获取密码char[] password = pwdField.getPassword(); 返回字符数组(而非 String),原因是 String 在 Java 中会被缓存,而字符数组可手动清空,更安全。
  • 设置掩盖字符pwdField.setEchoChar('•'); 将掩盖字符改为圆点(默认通常是星号 *)。
  • 清空密码pwdField.setText("");pwdField.setPassword(new char[0]); 清除输入的密码。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FirstPasswordField {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("密码框示例");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建面板(网格布局:2行2列,间距5像素)
        JPanel panel = new JPanel(new GridLayout(2, 2, 5, 15));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        
        // 3. 创建组件
        JLabel label = new JLabel("请输入密码:");
        JPasswordField pwdField = new JPasswordField(15); // 15列宽
        JButton loginBtn = new JButton("登录");
        JLabel tipLabel = new JLabel(""); // 用于显示提示信息
        
        // 4. 配置密码框
        pwdField.setEchoChar('•'); // 设置掩盖字符为圆点
        pwdField.setToolTipText("请输入6-12位密码");
        
        // 5. 登录按钮事件
        loginBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取密码(字符数组)
                char[] password = pwdField.getPassword();
                
                // 简单验证(实际应用中需加密处理)
                if (password.length < 6) {
                    tipLabel.setText("密码长度不能少于6位!");
                    tipLabel.setForeground(Color.RED);
                } else {
                    // 模拟登录成功(实际使用后应清空密码数组)
                    tipLabel.setText("登录成功!密码长度:" + password.length);
                    tipLabel.setForeground(Color.GREEN);
                    
                    // 安全做法:清空字符数组(避免内存中残留)
                    java.util.Arrays.fill(password, '0');
                }
            }
        });
        
        // 6. 添加组件到面板
        panel.add(label);
        panel.add(pwdField);
        panel.add(loginBtn);
        panel.add(tipLabel);
        
        // 7. 添加面板到窗口并显示
        frame.add(panel);
        frame.setVisible(true);
    }
}

注意事项

  1. 安全获取密码
    务必使用 getPassword() 而非 getText(),前者返回 char[] 可手动清空(如示例中的 Arrays.fill()),后者返回 String 会在内存中保留更长时间,存在安全风险。
  2. 掩盖字符
    不同外观风格(Look and Feel)可能默认使用不同的掩盖字符,可通过 setEchoChar() 自定义(如 *# 等)。
  3. 密码处理
    实际应用中,密码不应明文传输或存储,需进行加密处理(如 MD5、SHA 或加盐哈希)。
  4. JTextField 的区别
    除了掩盖输入,JPasswordField 的用法与 JTextField 基本一致,可视为 “安全版的单行文本框”。

JPasswordField 是处理敏感输入的专用组件,通过其特性可有效保护用户密码等私密信息,是登录、注册等场景的必备组件。

八、JButton

JButton – 是 Java Swing 中的按钮组件,用于触发用户交互,当用户点击按钮时可触发相应的操作(如提交表单、执行命令等),是图形界面中最常用的交互组件之一。

创建按钮

JButton button = new JButton();

JButton 提供了多个构造方法,用于创建不同初始状态的按钮:

  • JButton() 构造一个无文本、无图标的空按钮。
  • JButton(String text) 构造一个显示指定文本的按钮。
  • JButton(Icon icon) 构造一个显示指定图标的按钮。
  • JButton(String text, Icon icon) 构造一个同时显示文本和图标的按钮。

常用方法

方法名 作用
setText(String text) 设置按钮上的文本内容
getText() 获取按钮上的文本内容
setIcon(Icon icon) 设置按钮上的图标(如 ImageIcon
setToolTipText(String text) 设置鼠标悬停时显示的提示文本
setEnabled(boolean enabled) 设置按钮是否可用(false 为禁用状态,呈灰色)
addActionListener(ActionListener l) 为按钮添加点击事件监听器(核心功能)
setPreferredSize(Dimension d) 设置按钮的首选大小(宽 × 高)
setFont(Font font) 设置按钮文本的字体
setForeground(Color c) 设置按钮文本的颜色
setBackground(Color c) 设置按钮的背景颜色
  • 绑定点击事件:通过 addActionListener() 为按钮添加事件监听器,当按钮被点击时执行指定代码(核心用法)。
  • 禁用按钮button.setEnabled(false); 使按钮处于不可点击状态(如表单未填写完整时禁用提交按钮)。
  • 图文按钮button.setIcon(new ImageIcon("ok.png")); 给按钮添加图标,可通过 setHorizontalTextPosition() 调整文本与图标的相对位置。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FirstButton {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("按钮示例");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建面板(流式布局,组件间距10像素)
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 30));
        
        // 3. 创建按钮并配置
        // 按钮1:文本按钮
        JButton helloBtn = new JButton("点击打招呼");
        helloBtn.setFont(new Font("宋体", Font.PLAIN, 14));
        helloBtn.setToolTipText("点击我会弹出问候");
        
        // 按钮2:图标按钮(假设存在"exit.png"图片)
        JButton exitBtn = new JButton(new ImageIcon("exit.png"));
        exitBtn.setToolTipText("退出程序");
        exitBtn.setPreferredSize(new Dimension(80, 30)); // 固定大小
        
        // 按钮3:禁用状态按钮
        JButton disabledBtn = new JButton("不可用按钮");
        disabledBtn.setEnabled(false); // 禁用按钮
        
        // 4. 为按钮1添加点击事件
        helloBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 弹出对话框
                JOptionPane.showMessageDialog(frame, "你好!这是按钮点击事件~");
            }
        });
        
        // 5. 为按钮2添加点击事件(退出程序)
        exitBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int result = JOptionPane.showConfirmDialog(
                    frame, "确定要退出吗?", "提示", JOptionPane.YES_NO_OPTION);
                if (result == JOptionPane.YES_OPTION) {
                    System.exit(0); // 退出程序
                }
            }
        });
        
        // 6. 添加按钮到面板
        panel.add(helloBtn);
        panel.add(exitBtn);
        panel.add(disabledBtn);
        
        // 7. 添加面板到窗口并显示
        frame.add(panel);
        frame.setVisible(true);
    }
}

注意事项

  1. 事件监听JButton 的核心功能是通过 ActionListener 响应点击事件,所有业务逻辑(如表单提交、页面跳转)都在此实现。
  2. 按钮状态:通过 setEnabled(false) 可临时禁用按钮,常用于防止重复提交或非法操作。
  3. 图标路径:使用图标时需确保图片路径正确,若图片不存在,按钮会显示空白(不报错)。
  4. 快捷键:可通过 setMnemonic(KeyEvent.VK_O) 为按钮设置快捷键(如 Alt+O),增强操作便捷性。

JButton 是用户交互的核心入口,通过与事件监听器结合,可实现各种交互逻辑,是构建响应式界面的基础组件。

九、JMenuItem

JMenuItem – 是 Java Swing 中的菜单项组件,用于创建菜单中的可点击选项,通常嵌套在 JMenuJPopupMenu 中,用户点击后可触发相应操作(如文件菜单中的 "打开"、"保存" 选项)。

创建菜单项

JMenuItem item = new JMenuItem();

JMenuItem 提供了多个构造方法,用于创建不同样式的菜单项:

  • JMenuItem() 构造一个无文本、无图标的空菜单项。
  • JMenuItem(String text) 构造一个显示指定文本的菜单项(最常用)。
  • JMenuItem(Icon icon) 构造一个显示指定图标的菜单项。
  • JMenuItem(String text, Icon icon) 构造一个同时显示文本和图标的菜单项。
  • JMenuItem(String text, int mnemonic) 构造带文本和快捷键的菜单项(mnemonic 为快捷键字符,如 KeyEvent.VK_O 对应 O 键)。

常用方法

方法名 作用
setText(String text) 设置菜单项的文本内容
getText() 获取菜单项的文本内容
setIcon(Icon icon) 设置菜单项的图标
setToolTipText(String text) 设置鼠标悬停时的提示文本
setEnabled(boolean enabled) 设置菜单项是否可用(false 为禁用,呈灰色)
setMnemonic(int mnemonic) 设置快捷键(如 KeyEvent.VK_S 对应 S,需配合 Alt 键使用)
setAccelerator(KeyStroke keyStroke) 设置加速键(无需打开菜单即可触发,如 Ctrl+S
addActionListener(ActionListener l) 为菜单项添加点击事件监听器
  • 快捷键设置item.setMnemonic(KeyEvent.VK_O); 设置 Alt+O 为快捷键(需先打开菜单)。
  • 加速键设置item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); 设置 Ctrl+S 为加速键(直接触发,无需打开菜单)。
  • 事件响应:通过 addActionListener() 绑定点击事件,实现菜单项的功能(如保存文件、退出程序)。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

public class FirstMenuItem {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("菜单项示例");
        frame.setSize(500, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建菜单栏
        JMenuBar menuBar = new JMenuBar();
        
        // 3. 创建"文件"菜单
        JMenu fileMenu = new JMenu("文件(F)");
        fileMenu.setMnemonic(KeyEvent.VK_F); // 菜单快捷键:Alt+F
        
        // 4. 创建菜单项并配置
        // 新建菜单项
        JMenuItem newItem = new JMenuItem("新建(N)");
        newItem.setMnemonic(KeyEvent.VK_N); // 菜单项快捷键:Alt+N
        newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK)); // Ctrl+N
        
        // 打开菜单项
        JMenuItem openItem = new JMenuItem("打开(O)");
        openItem.setMnemonic(KeyEvent.VK_O);
        openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK)); // Ctrl+O
        
        // 保存菜单项
        JMenuItem saveItem = new JMenuItem("保存(S)");
        saveItem.setMnemonic(KeyEvent.VK_S);
        saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); // Ctrl+S
        
        // 分隔线(用于分组菜单项)
        JSeparator separator = new JSeparator();
        
        // 退出菜单项
        JMenuItem exitItem = new JMenuItem("退出(X)");
        exitItem.setMnemonic(KeyEvent.VK_X);
        
        // 5. 为菜单项添加点击事件
        newItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "执行新建操作");
            }
        });
        
        openItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "执行打开操作");
            }
        });
        
        saveItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "执行保存操作");
            }
        });
        
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0); // 退出程序
            }
        });
        
        // 6. 组装菜单(菜单项添加到菜单,菜单添加到菜单栏)
        fileMenu.add(newItem);
        fileMenu.add(openItem);
        fileMenu.add(saveItem);
        fileMenu.add(separator); // 添加分隔线
        fileMenu.add(exitItem);
        
        menuBar.add(fileMenu);
        
        // 7. 设置窗口的菜单栏
        frame.setJMenuBar(menuBar);
        
        // 8. 显示窗口
        frame.setVisible(true);
    }
}

注意事项

  1. 菜单层级JMenuItem 必须添加到 JMenuJPopupMenu 中,不能直接添加到窗口,形成 "菜单栏→菜单→菜单项" 的层级结构。

  2. 快捷键与加速键

    • 快捷键(setMnemonic):需先打开菜单,再按 Alt+字符 触发(如 Alt+F 打开文件菜单,再按 N 触发新建)。
    • 加速键(setAccelerator):无需打开菜单,直接按组合键触发(如 Ctrl+S 直接触发保存)。
  3. 分隔线:使用 JSeparator 可将功能相关的菜单项分组,提升菜单可读性。

  4. 禁用状态:通过 setEnabled(false) 可禁用暂时不可用的菜单项(如未打开文件时禁用 "保存")。

JMenuItem 是菜单系统的核心组件,通过合理配置文本、图标和快捷键,可创建直观易用的菜单交互,是桌面应用的标准组成部分。

十一、JOptionPane

JOptionPane – 是 Java Swing 中的对话框组件,用于快速创建标准对话框(如提示信息、确认操作、输入框等),无需手动构建窗口和面板,简化了交互提示功能的实现。

对话框类型

JOptionPane 提供了多种静态方法,用于创建不同用途的对话框:

  • 消息对话框(Message Dialog):显示提示信息(如操作成功、错误提示)。
  • 确认对话框(Confirm Dialog):询问用户确认操作(如 "确定删除?"),返回用户选择结果。
  • 输入对话框(Input Dialog):获取用户输入的文本内容。
  • 选项对话框(Option Dialog):自定义选项按钮,更灵活的交互选择。

常用方法

方法名 作用
showMessageDialog(Component parent, Object message) 显示消息对话框(默认信息图标)
showMessageDialog(Component parent, Object message, String title, int messageType) 显示带标题和图标的消息对话框
showConfirmDialog(Component parent, Object message) 显示确认对话框(默认 "确定 / 取消" 按钮)
showConfirmDialog(Component parent, Object message, String title, int optionType) 显示带标题和自定义按钮的确认对话框
showInputDialog(Component parent, Object message) 显示输入对话框,返回用户输入的文本
showOptionDialog(Component parent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue) 显示自定义选项对话框
  • 消息类型(messageType:决定对话框图标,可选值:
    • JOptionPane.INFORMATION_MESSAGE:信息图标(默认)
    • JOptionPane.WARNING_MESSAGE:警告图标
    • JOptionPane.ERROR_MESSAGE:错误图标
    • JOptionPane.QUESTION_MESSAGE:问号图标
    • JOptionPane.PLAIN_MESSAGE:无图标
  • 选项类型(optionType:决定确认对话框的按钮组合,可选值:
    • JOptionPane.DEFAULT_OPTION:仅 "确定" 按钮
    • JOptionPane.YES_NO_OPTION:"是 / 否" 按钮
    • JOptionPane.YES_NO_CANCEL_OPTION:"是 / 否 / 取消" 按钮

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FirstJOptionPane {
    public static void main(String[] args) {
        // 1. 创建主窗口和按钮
        JFrame frame = new JFrame("对话框示例");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 50));
        
        // 消息对话框按钮
        JButton msgBtn = new JButton("显示消息对话框");
        // 确认对话框按钮
        JButton confirmBtn = new JButton("显示确认对话框");
        // 输入对话框按钮
        JButton inputBtn = new JButton("显示输入对话框");
        // 选项对话框按钮
        JButton optionBtn = new JButton("显示选项对话框");
        
        // 2. 消息对话框示例
        msgBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 信息提示框
                JOptionPane.showMessageDialog(frame, 
                    "操作成功完成!", 
                    "提示", 
                    JOptionPane.INFORMATION_MESSAGE);
                
                // 错误提示框
                // JOptionPane.showMessageDialog(frame, "文件不存在!", "错误", JOptionPane.ERROR_MESSAGE);
            }
        });
        
        // 3. 确认对话框示例
        confirmBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int result = JOptionPane.showConfirmDialog(frame, 
                    "确定要删除这条记录吗?", 
                    "确认", 
                    JOptionPane.YES_NO_OPTION, 
                    JOptionPane.WARNING_MESSAGE);
                
                // 根据用户选择执行操作(0=是,1=否)
                if (result == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(frame, "记录已删除");
                } else {
                    JOptionPane.showMessageDialog(frame, "操作已取消");
                }
            }
        });
        
        // 4. 输入对话框示例
        inputBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String input = JOptionPane.showInputDialog(frame, 
                    "请输入您的姓名:", 
                    "输入", 
                    JOptionPane.QUESTION_MESSAGE);
                
                // 判断用户是否输入内容(点击取消返回null)
                if (input != null && !input.isEmpty()) {
                    JOptionPane.showMessageDialog(frame, "您好," + input + "!");
                } else {
                    JOptionPane.showMessageDialog(frame, "未输入姓名");
                }
            }
        });
        
        // 5. 选项对话框示例
        optionBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 自定义选项按钮
                Object[] options = {"红色", "蓝色", "绿色"};
                
                int choice = JOptionPane.showOptionDialog(frame, 
                    "请选择背景颜色:", 
                    "颜色选择", 
                    JOptionPane.DEFAULT_OPTION, 
                    JOptionPane.PLAIN_MESSAGE, 
                    null, 
                    options, 
                    options[0]); // 默认选中第一项
                
                // 根据选择设置面板背景
                if (choice != -1) { // -1表示用户关闭对话框
                    switch (choice) {
                        case 0: panel.setBackground(Color.RED); break;
                        case 1: panel.setBackground(Color.BLUE); break;
                        case 2: panel.setBackground(Color.GREEN); break;
                    }
                }
            }
        });
        
        // 组装界面
        panel.add(msgBtn);
        panel.add(confirmBtn);
        panel.add(inputBtn);
        panel.add(optionBtn);
        frame.add(panel);
        
        frame.setVisible(true);
    }
}

注意事项

  1. 父组件参数:方法中的 parent 参数指定对话框的父窗口,对话框会相对于父窗口居中显示;若为 null,则相对于屏幕居中。

  2. 返回值处理

    • 确认对话框返回用户选择的按钮索引(如 YES_OPTION=0NO_OPTION=1)。
    • 输入对话框返回用户输入的字符串(点击 "取消" 返回 null)。
    • 选项对话框返回选中的选项索引(关闭对话框返回 -1)。
  3. 模态特性JOptionPane 创建的对话框默认是模态的(modal),即对话框显示时会阻塞父窗口的操作,直到对话框关闭。

  4. 自定义内容:对话框的 message 参数不仅可以是字符串,还可以是组件(如 JPanelJLabel 等),实现复杂的提示内容。

JOptionPane 简化了标准对话框的开发,通过其静态方法可快速实现常见的交互提示功能,是 Swing 中提高开发效率的重要组件。

十二、JDialog

JDialog – 是 Java Swing 中的对话框组件,用于创建独立于主窗口的弹出式窗口,通常用于接收用户输入、显示提示信息或进行简单交互(如确认操作、输入参数等)。

创建对话框

JDialog dialog = new JDialog();

JDialog 提供了多个构造方法,用于创建不同特性的对话框:

JDialog () 构造一个无标题、无父窗口的非模态对话框。
JDialog (Frame owner) 构造一个指定父窗口的非模态对话框。
JDialog (Frame owner, String title) 构造一个指定父窗口和标题的非模态对话框。
JDialog (Frame owner, String title, boolean modal) 构造一个指定父窗口、标题和模态性的对话框(modal 为 true 时为模态对话框,会阻塞父窗口操作)。

常用方法

方法名 作用
setTitle(String title) 设置对话框标题
setSize(int width, int height) 设置对话框大小
setLocationRelativeTo(Component c) 设置对话框位置(相对于指定组件居中,传 null 则屏幕居中)
setModal(boolean modal) 设置是否为模态对话框(true 为模态)
setDefaultCloseOperation(int operation) 设置关闭操作(如 DISPOSE_ON_CLOSE 关闭时释放资源)
add(Component comp) 向对话框添加组件
setVisible(boolean b) 设置对话框是否可见(true 显示,false 隐藏)
dispose() 关闭并释放对话框资源
setResizable(boolean resizable) 设置对话框是否可调整大小

模态与非模态:

  • 模态对话框(modal = true):显示时会阻塞父窗口操作,必须关闭对话框才能回到父窗口(如确认对话框)。
  • 非模态对话框(modal = false):显示时不阻塞父窗口,可同时操作两者(如工具面板)。

事件响应:

通过为对话框中的按钮等组件添加 ActionListener 实现交互逻辑,如确认、取消等操作。

简要代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class DialogExample {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("主窗口");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        
        // 2. 创建按钮,点击显示对话框
        JButton showDialogBtn = new JButton("打开对话框");
        frame.add(showDialogBtn);
        
        // 3. 为按钮添加点击事件,创建并显示对话框
        showDialogBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 创建模态对话框,父窗口为frame
                JDialog dialog = new JDialog(frame, "示例对话框", true);
                dialog.setSize(300, 200);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setLocationRelativeTo(frame); // 相对于主窗口居中
                
                // 向对话框添加组件
                JPanel panel = new JPanel();
                panel.setLayout(new FlowLayout());
                
                JLabel label = new JLabel("请输入姓名:");
                JTextField textField = new JTextField(15);
                JButton confirmBtn = new JButton("确认");
                JButton cancelBtn = new JButton("取消");
                
                // 确认按钮事件
                confirmBtn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String name = textField.getText();
                        JOptionPane.showMessageDialog(dialog, "你输入的姓名是:" + name);
                        dialog.dispose(); // 关闭对话框
                    }
                });
                
                // 取消按钮事件
                cancelBtn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        dialog.dispose(); // 关闭对话框
                    }
                });
                
                panel.add(label);
                panel.add(textField);
                panel.add(confirmBtn);
                panel.add(cancelBtn);
                
                dialog.add(panel);
                dialog.setVisible(true); // 显示对话框
            }
        });
        
        // 4. 显示主窗口
        frame.setVisible(true);
    }
}

注意事项

  • 父窗口关联:创建对话框时建议指定父窗口,使对话框在任务栏中与父窗口关联,且关闭父窗口时会自动关闭对话框。
  • 资源释放:使用 DISPOSE_ON_CLOSE 作为关闭操作,确保对话框关闭时释放资源,避免内存泄漏。
  • 模态对话框阻塞性:模态对话框的 setVisible (true) 方法会阻塞当前线程,直到对话框关闭,因此不应在事件调度线程中执行耗时操作。
  • 布局管理:对话框默认使用 BorderLayout,需根据需求设置合适的布局管理器来排列组件。

JDialog 是 Swing 中实现弹窗交互的核心组件,通过合理设置模态性和添加交互组件,可满足各种用户输入和信息展示需求,是桌面应用中不可或缺的交互元素。

posted @ 2025-08-10 20:32  野云闲出眠  阅读(99)  评论(0)    收藏  举报