上一篇                     
               
			  如何在Java中高效使用文本框和表格?
- 后端开发
- 2025-07-07
- 4076
 在Java中,使用Swing组件创建文本框(JTextField)和表格(JTable),通过JFrame容器布局,结合JScrollPane实现滚动表格,监听事件处理用户输入,实现数据交互展示功能。
 
在Java中创建文本框和表格主要依赖Swing库(javax.swing),以下是详细实现方法及完整代码示例,所有代码均基于Java标准库,无需额外依赖。
文本框(JTextField)实现
文本框用于接收用户输入的文本,核心类是JTextField。
基础步骤:
- 创建JFrame窗口作为容器
- 初始化JTextField并设置属性
- 添加文本框到窗口
- 添加事件监听(如回车提交)
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextFieldExample {
    public static void main(String[] args) {
        // 1. 创建窗口
        JFrame frame = new JFrame("文本框示例");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new java.awt.FlowLayout());
        // 2. 创建文本框
        JTextField textField = new JTextField(20); // 20列宽度
        textField.setToolTipText("请输入内容"); // 悬停提示
        // 3. 添加回车事件监听
        textField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frame, "输入内容: " + textField.getText());
            }
        });
        // 4. 添加组件到窗口
        frame.add(new JLabel("输入文本:"));
        frame.add(textField);
        frame.setVisible(true); // 显示窗口
    }
} 
关键特性:

- setColumns(int):设置文本框可见宽度
- getText():获取输入内容
- setEditable(false):设为只读模式
- 事件监听:支持ActionListener(回车触发)或DocumentListener(实时监听输入变化)
表格(JTable)实现
表格通过JTable类展示数据,需配合TableModel管理数据。
基础步骤:
- 定义表格数据模型(使用DefaultTableModel)
- 创建JTable并绑定模型
- 将表格放入滚动面板(JScrollPane)
- 添加面板到窗口
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class TableExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("表格示例");
        frame.setSize(500, 300);
        // 1. 创建表格模型(指定列名和初始数据)
        String[] columns = {"姓名", "年龄", "职业"};
        Object[][] data = {
            {"张三", 25, "工程师"},
            {"李四", 30, "设计师"},
            {"王五", 28, "产品经理"}
        };
        DefaultTableModel model = new DefaultTableModel(data, columns);
        // 2. 创建表格并绑定模型
        JTable table = new JTable(model);
        table.setFillsViewportHeight(true); // 填充视图高度
        // 3. 添加表格到滚动面板(支持大数据量滚动)
        JScrollPane scrollPane = new JScrollPane(table);
        // 4. 添加组件到窗口
        frame.add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
} 
关键操作:

-  增删数据: // 添加行 model.addRow(new Object[]{"赵六", 35, "总监"}); // 删除选中行 int selectedRow = table.getSelectedRow(); if (selectedRow >= 0) { model.removeRow(selectedRow); }
-  自定义渲染:继承 DefaultTableCellRenderer修改单元格样式
-  排序:调用 table.setAutoCreateRowSorter(true)启用列排序
文本框与表格联动示例
实现输入文本框内容实时过滤表格数据:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import java.awt.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class FilterTableExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("表格过滤示例");
        frame.setLayout(new BorderLayout());
        // 1. 创建表格
        DefaultTableModel model = new DefaultTableModel(
            new Object[][]{{"Apple", "水果"}, {"Carrot", "蔬菜"}, {"Beef", "肉类"}},
            new String[]{"名称", "类型"}
        );
        JTable table = new JTable(model);
        TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<>(model);
        table.setRowSorter(sorter);
        // 2. 创建过滤文本框
        JTextField filterField = new JTextField(20);
        filterField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) { filter(); }
            @Override
            public void removeUpdate(DocumentEvent e) { filter(); }
            @Override
            public void changedUpdate(DocumentEvent e) { filter(); }
            private void filter() {
                String text = filterField.getText();
                if (text.trim().isEmpty()) {
                    sorter.setRowFilter(null);
                } else {
                    // 按第一列(名称)过滤
                    sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text, 0));
                }
            }
        });
        // 3. 布局组件
        JPanel panel = new JPanel();
        panel.add(new JLabel("输入过滤:"));
        panel.add(filterField);
        frame.add(panel, BorderLayout.NORTH);
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
} 
最佳实践与注意事项
- 线程安全: 
  - Swing组件必须在事件调度线程(EDT)中操作: SwingUtilities.invokeLater(() -> new TextFieldExample()); 
 
- Swing组件必须在事件调度线程(EDT)中操作: 
- 性能优化: 
  - 大数据表格使用TableModel分批加载数据
- 避免频繁更新模型,批量操作后调用fireTableDataChanged()
 
- 大数据表格使用
- 可访问性: 
  - 为组件设置setToolTipText()提升用户体验
- 使用JLabel关联文本框(setLabelFor())
 
- 为组件设置
引用说明
本文代码基于Java官方Swing教程,遵循Oracle Java SE规范,关键参考:
- Oracle官方文档:How to Use Text Fields
- Oracle官方文档:How to Use Tables
- 事件模型设计参考《Java Swing, 2nd Edition》(O’Reilly)
所有示例均通过JDK 11+测试,兼容主流操作系统,建议开发者使用IDE(如IntelliJ IDEA/Eclipse)调试运行。
 
			 
			 
			 
			