Java Swing 中在面板添加表格的详细指南
在Java Swing开发中,表格组件是展示结构化数据的强大工具,下面我将详细介绍如何在JPanel中添加表格,并提供完整示例代码。
核心步骤
创建表格数据模型
// 定义表格列名 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: 使用以下方法:
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面板中添加表格的核心步骤是:
- 准备表格数据和列名
- 创建TableModel(数据模型)
- 创建JTable实例
- 将表格放入JScrollPane
- 将滚动面板添加到主面板
通过合理使用表格模型、自定义渲染器和排序器,可以创建功能强大且用户友好的数据展示界面,本文提供的完整示例展示了如何实现带搜索、添加和删除功能的表格界面,您可以根据具体需求调整代码。
基于Java Swing官方文档和最佳实践编写,代码示例在Java 8及以上版本测试通过,使用了Swing核心组件,无需额外依赖。
通过本文的详细讲解和完整示例,您应该能够掌握在Java面板中添加表格的各项技能,并创建出专业的数据展示界面。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/10467.html