Java面板如何快速添加表格?

在Java Swing中,使用JTable组件创建表格,将其放入JScrollPane后添加到JPanel,示例:定义表格模型数据,创建JTable实例后通过add(new JScrollPane(table))嵌入面板,实现数据可视化展示。

Java Swing 中在面板添加表格的详细指南

在Java Swing开发中,表格组件是展示结构化数据的强大工具,下面我将详细介绍如何在JPanel中添加表格,并提供完整示例代码。

Java面板如何快速添加表格?

核心步骤

创建表格数据模型

// 定义表格列名
String[] columnNames = {"ID", "姓名", "职位", "入职日期", "薪资"};
// 准备表格数据
Object[][] data = {
    {1, "张三", "高级工程师", "2020-03-15", 18500.00},
    {2, "李四", "产品经理", "2019-11-22", 16800.00},
    {3, "王五", "UI设计师", "2021-02-10", 15200.00},
    {4, "赵六", "测试工程师", "2020-08-05", 14500.00},
    {5, "钱七", "前端开发", "2021-05-19", 16200.00}
};

创建JTable实例

// 使用DefaultTableModel创建表格
DefaultTableModel model = new DefaultTableModel(data, columnNames);
JTable table = new JTable(model);
// 设置表格属性
table.setRowHeight(30); // 行高
table.setFont(new Font("微软雅黑", Font.PLAIN, 14)); // 字体
table.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 15)); // 表头字体

将表格添加到滚动面板

JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBorder(BorderFactory.createTitledBorder("员工信息表"));

添加到主面板

JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(scrollPane, BorderLayout.CENTER);
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

完整示例代码

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
public class TableInPanelDemo extends JFrame {
    public TableInPanelDemo() {
        super("Java面板中添加表格示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 500);
        setLocationRelativeTo(null);
        // 创建主面板
        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        // 创建表格数据模型
        String[] columnNames = {"ID", "姓名", "职位", "入职日期", "薪资"};
        Object[][] data = {
            {1, "张三", "高级工程师", "2020-03-15", 18500.00},
            {2, "李四", "产品经理", "2019-11-22", 16800.00},
            {3, "王五", "UI设计师", "2021-02-10", 15200.00},
            {4, "赵六", "测试工程师", "2020-08-05", 14500.00},
            {5, "钱七", "前端开发", "2021-05-19", 16200.00}
        };
        // 创建表格模型
        DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            @Override
            public boolean isCellEditable(int row, int column) {
                // 使ID列不可编辑
                return column != 0;
            }
        };
        // 创建表格
        JTable table = new JTable(model);
        table.setRowHeight(30);
        table.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        table.getTableHeader().setFont(new Font("微软雅黑", Font.BOLD, 15));
        // 设置表格选择模式
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // 添加表格到滚动面板
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(BorderFactory.createTitledBorder("员工信息表"));
        // 添加控件到主面板
        mainPanel.add(scrollPane, BorderLayout.CENTER);
        // 创建底部面板
        JPanel bottomPanel = createBottomPanel(table, model);
        mainPanel.add(bottomPanel, BorderLayout.SOUTH);
        // 添加主面板到窗口
        add(mainPanel);
        setVisible(true);
    }
    private JPanel createBottomPanel(JTable table, DefaultTableModel model) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 15, 15));
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        // 添加新行按钮
        JButton addButton = new JButton("添加新员工");
        addButton.setFont(new Font("微软雅黑", Font.BOLD, 14));
        addButton.setBackground(new Color(46, 139, 87));
        addButton.setForeground(Color.WHITE);
        addButton.addActionListener(e -> {
            model.addRow(new Object[]{model.getRowCount() + 1, "新员工", "职位", "2025-01-01", 10000.00});
            table.scrollRectToVisible(table.getCellRect(model.getRowCount() - 1, 0, true));
        });
        // 删除选中行按钮
        JButton deleteButton = new JButton("删除选中行");
        deleteButton.setFont(new Font("微软雅黑", Font.BOLD, 14));
        deleteButton.setBackground(new Color(178, 34, 34));
        deleteButton.setForeground(Color.WHITE);
        deleteButton.addActionListener(e -> {
            int selectedRow = table.getSelectedRow();
            if (selectedRow != -1) {
                model.removeRow(selectedRow);
            } else {
                JOptionPane.showMessageDialog(this, "请先选择一行!", "提示", JOptionPane.WARNING_MESSAGE);
            }
        });
        // 搜索功能
        JTextField searchField = new JTextField(20);
        searchField.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        JButton searchButton = new JButton("搜索");
        searchButton.setFont(new Font("微软雅黑", Font.BOLD, 14));
        searchButton.setBackground(new Color(70, 130, 180));
        searchButton.setForeground(Color.WHITE);
        searchButton.addActionListener(e -> {
            String searchText = searchField.getText().toLowerCase();
            if (!searchText.isEmpty()) {
                for (int row = 0; row < table.getRowCount(); row++) {
                    boolean found = false;
                    for (int col = 0; col < table.getColumnCount(); col++) {
                        Object value = table.getValueAt(row, col);
                        if (value != null && value.toString().toLowerCase().contains(searchText)) {
                            found = true;
                            break;
                        }
                    }
                    if (found) {
                        table.setRowSelectionInterval(row, row);
                        table.scrollRectToVisible(table.getCellRect(row, 0, true));
                        return;
                    }
                }
                JOptionPane.showMessageDialog(this, "未找到匹配项", "搜索结果", JOptionPane.INFORMATION_MESSAGE);
            }
        });
        panel.add(addButton);
        panel.add(deleteButton);
        panel.add(new JLabel("搜索:"));
        panel.add(searchField);
        panel.add(searchButton);
        return panel;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            new TableInPanelDemo();
        });
    }
}

表格使用技巧

表格自定义渲染

// 设置薪资列的渲染器(显示为货币格式)
table.getColumnModel().getColumn(4).setCellRenderer(new DefaultTableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, 
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value, 
                isSelected, hasFocus, row, column);
        if (value instanceof Double) {
            setText(String.format("¥%.2f", (Double)value));
            setHorizontalAlignment(SwingConstants.RIGHT);
        }
        // 高亮薪资高于16000的行
        if (row >= 0 && column == 4) {
            Double salary = (Double)table.getModel().getValueAt(row, 4);
            if (salary > 16000) {
                comp.setBackground(new Color(255, 255, 200)); // 淡黄色背景
            } else {
                comp.setBackground(table.getBackground());
            }
        }
        return comp;
    }
});

数据排序

// 启用表格排序
table.setAutoCreateRowSorter(true);
// 设置自定义排序器(按薪资排序)
table.setRowSorter(new TableRowSorter<>(model));
TableRowSorter<DefaultTableModel> sorter = (TableRowSorter<DefaultTableModel>) table.getRowSorter();
sorter.setComparator(4, (o1, o2) -> {
    Double d1 = (Double) o1;
    Double d2 = (Double) o2;
    return d1.compareTo(d2);
});

常见问题解答

Q: 表格显示不出来可能是什么原因?
A: 常见原因包括:

  • 表格未添加到滚动面板
  • 面板未正确设置布局管理器
  • 未将面板添加到JFrame可见区域

Q: 如何从表格获取选中行的数据?
A: 使用以下代码:

int selectedRow = table.getSelectedRow();
if (selectedRow != -1) {
    int id = (int) table.getValueAt(selectedRow, 0);
    String name = (String) table.getValueAt(selectedRow, 1);
    // ... 获取其他列数据
}

Q: 如何让表格列宽自适应内容?
A: 使用以下方法:

Java面板如何快速添加表格?

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i < table.getColumnCount(); i++) {
    TableColumn column = table.getColumnModel().getColumn(i);
    column.setPreferredWidth(150); // 设置首选宽度
}

在Java Swing面板中添加表格的核心步骤是:

  1. 准备表格数据和列名
  2. 创建TableModel(数据模型)
  3. 创建JTable实例
  4. 将表格放入JScrollPane
  5. 将滚动面板添加到主面板

通过合理使用表格模型、自定义渲染器和排序器,可以创建功能强大且用户友好的数据展示界面,本文提供的完整示例展示了如何实现带搜索、添加和删除功能的表格界面,您可以根据具体需求调整代码。
基于Java Swing官方文档和最佳实践编写,代码示例在Java 8及以上版本测试通过,使用了Swing核心组件,无需额外依赖。

通过本文的详细讲解和完整示例,您应该能够掌握在Java面板中添加表格的各项技能,并创建出专业的数据展示界面。

Java面板如何快速添加表格?

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/10467.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月2日 16:09
下一篇 2025年6月2日 16:15

相关推荐

  • Java如何设置背景图片?

    在Java Swing中设置背景图可通过重写JPanel的paintComponent方法实现,关键步骤:使用ImageIO读取图片,在paintComponent中用drawImage绘制并适配组件尺寸,注意路径处理与组件层级管理,确保图片正确加载和动态调整。

    2025年5月30日
    200
  • java代码怎么保存在哪个文件夹

    Java代码通常保存在项目根目录下的src文件夹中,该文件夹用于存放源代码文件(.java)及资源文件

    2025年7月23日
    000
  • 在java中怎么改后缀名

    Java中改后缀名可通过文件重命名工具右键重命名添加,或用文本编辑器保存时修改,也可在命令行用mv命令重命名

    2025年7月12日
    000
  • 如何在Java中使用HTTPS请求?

    在Java中使用HTTPS请求可通过HttpsURLConnection实现:创建URL对象,打开连接,设置请求方法(如GET/POST),添加头部信息,处理SSL证书验证(需自定义TrustManager或使用有效证书),最后获取输入流读取响应数据,注意异常处理和资源关闭。

    2025年6月11日
    000
  • 怎么设置java虚拟机共享

    Java虚拟机共享,需先安装对应虚拟机工具,如VMware Tools或VirtualBox Guest Additions,再于虚拟机设置中添加共享文件夹,配置其路径、名称及挂载选项等,同时确保主机与虚拟机系统权限设置正确

    2025年7月22日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN