关于Swing JTable的getColumnClass

 今天在测试如下代码时,总是会报错。

报错信息如下:

报错信息中似乎看不出什么。

  最后经过多次的测试才发现,当将JTable的某一列的类型设置为基本数据类型的时候,就会产生这个错误,而设置为对应的封装类则没有这种情况,不清楚是什么原因。

  上面代码稍做改动即可测试通过:

 

JTable 是 Java Swing 中的一个组件,用于显示表格数据。如果需要在 JTable 中显示树形结构的数据,可以通过使用 JTree 和 JTable 的组合来实现。 实现步骤如下: 1. 创建一个 JTree 对象来表示树形结构的数据。 2. 创建一个 DefaultTableModel 对象作为 JTable 的数据模型。 3. 将 JTable 的数据模型设置为一个可编辑的 TreeTableModel,其中 TreeTableModel 是一个自定义的接口,继承了 TableModel 和 TreeModel 接口。 4. 将 JTable 和 JTree 进行组合,使得 JTable 中每一行的第一列是一个可展开/折叠的树形节点。 以下是一个简单的示例代码: ```java import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; public class JTableTreeDemo extends JFrame { private static final long serialVersionUID = 1L; public JTableTreeDemo() { super("JTableTreeDemo"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建树形结构的数据 DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Node1"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Node2"); DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("Node3"); root.add(node1); root.add(node2); node2.add(node3); JTree tree = new JTree(root); // 创建 JTable 的数据模型 DefaultTableModel model = new DefaultTableModel(new Object[][] { { "Node1", "Value1" }, { "Node2", "Value2" }, { "Node3", "Value3" }, }, new String[] { "Name", "Value" }); // 创建 TreeTableModel 对象,将 JTable 的数据模型设置为可编辑的 TreeTableModel TreeTableModel treeTableModel = new TreeTableModel(tree.getModel(), model); JTable table = new JTable(treeTableModel); // 设置 JTable 中第一列为树形结构 table.getColumnModel().getColumn(0).setCellRenderer(new TreeTableCellRenderer()); table.setPreferredScrollableViewportSize(new Dimension(300, 200)); // 监听树形结构的变化,更新 JTable 的数据模型 tree.getModel().addTreeModelListener(new TreeModelListener() { @Override public void treeStructureChanged(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesRemoved(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesInserted(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } @Override public void treeNodesChanged(TreeModelEvent e) { treeTableModel.setTreeModel(tree.getModel()); } }); // 将 JTable 和 JTree 进行组合 JScrollPane scrollPane = new JScrollPane(table); scrollPane.setRowHeaderView(tree); getContentPane().add(scrollPane, BorderLayout.CENTER); pack(); setLocationRelativeTo(null); } public static void main(String[] args) { JTableTreeDemo demo = new JTableTreeDemo(); demo.setVisible(true); } // TreeTableModel 接口的实现 private static class TreeTableModel implements TableModel, TreeModel { private TreeModel treeModel; private TableModel tableModel; public TreeTableModel(TreeModel treeModel, TableModel tableModel) { this.treeModel = treeModel; this.tableModel = tableModel; } public void setTreeModel(TreeModel treeModel) { this.treeModel = treeModel; } @Override public int getRowCount() { return tableModel.getRowCount(); } @Override public int getColumnCount() { return tableModel.getColumnCount(); } @Override public String getColumnName(int columnIndex) { return tableModel.getColumnName(columnIndex); } @Override public Class<?> getColumnClass(int columnIndex) { return tableModel.getColumnClass(columnIndex); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return tableModel.isCellEditable(rowIndex, columnIndex); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return tableModel.getValueAt(rowIndex, columnIndex); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { tableModel.setValueAt(aValue, rowIndex, columnIndex); } @Override public void addTableModelListener(TableModelListener l) { tableModel.addTableModelListener(l); } @Override public void removeTableModelListener(TableModelListener l) { tableModel.removeTableModelListener(l); } @Override public Object getRoot() { return treeModel.getRoot(); } @Override public Object getChild(Object parent, int index) { return treeModel.getChild(parent, index); } @Override public int getChildCount(Object parent) { return treeModel.getChildCount(parent); } @Override public boolean isLeaf(Object node) { return treeModel.isLeaf(node); } @Override public void valueForPathChanged(TreePath path, Object newValue) { treeModel.valueForPathChanged(path, newValue); } @Override public int getIndexOfChild(Object parent, Object child) { return treeModel.getIndexOfChild(parent, child); } @Override public void addTreeModelListener(TreeModelListener l) { treeModel.addTreeModelListener(l); } @Override public void removeTreeModelListener(TreeModelListener l) { treeModel.removeTreeModelListener(l); } } // 自定义的 TableCellRenderer,用于显示树形结构的数据 private static class TreeTableCellRenderer extends JTree implements javax.swing.table.TableCellRenderer { private static final long serialVersionUID = 1L; private int visibleRow; public TreeTableCellRenderer() { setRootVisible(false); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); } visibleRow = row; return this; } @Override public Dimension getPreferredSize() { Dimension preferredSize = super.getPreferredSize(); if (visibleRow >= 0) { preferredSize.width = getParent().getWidth(); } return preferredSize; } } } ``` 运行该示例代码,可以看到一个包含树形结构的 JTable
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值