树形表

开发工具与关键技术: MVC
作者:罗培发
撰写时间:2021.4.28
1、 树形表的配置
在这里插入图片描述

2、 查询树形表的数据
在这里插入图片描述

3、 树形表的删除和修改

在这里插入图片描述

4、 运用的树形的表单
在这里插入图片描述

5、运用的心得
树形表可以帮助我们快速查看每个节点的上下层关系,新增每一个节点清晰明了!能帮我们,在表单里,清晰查看表单里的对应关系,相比下拉框的查询和查找,都不如树形的快捷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值