Jtable 作为 Jtree 节点

Posted

技术标签:

【中文标题】Jtable 作为 Jtree 节点【英文标题】:Jtable as a Jtree Node 【发布时间】:2012-02-08 23:23:55 【问题描述】:

我知道你可以创建一个table and add a JTree as a column。但我想做的却完全相反。

检查图像并告诉我这是否可能。谢谢!

更新:

通过使用 MKorbel 的代码并使用以下代码随机化列数:

@Override
public int getColumnCount() 
    int i = (int) (Math.random( )* 10.0);
    if (i%2 ==0)
        return 2;
    else
        return 3;

我能够得到以下图像:

【问题讨论】:

我还没有测试过,但是为什么不可以呢。 API 请求渲染器返回一个组件。 JTable 是一个组件。在 JTable 中编辑/选择可能会更困难 @Robin 但我的意思是在视觉上,它合适吗?有什么困难吗? 现在这很有趣。我的 2 美分:我只是觉得如果你的桌子很大,你的树可能看起来有点时髦。另外,我很好奇你是否真的能够与桌子互动。会不会只是一张桌子的图片? @user489041 就我而言,我只是将它用作只读。但让它可编辑会很有趣,... 这个JTree with JTable in Node看起来和你的图片很像,放在那里JPanel --> JScrollPane --> JTable,是JTree可以编辑,然后你可以编辑Cell JTable 也是,+1 好问题 【参考方案1】:

1) 我没有解决 isLeaf()RendererEditor 不知何故

2) 如果我将JScrollPaneJTable 直接放在Node 中,(不使用JPanel 作为parent)然后JTree View 在start_up 后没有正确呈现有关更多信息,请参阅我的问题Put JTable in the JTree

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.*;

public class TreeWithTableRenderer extends JFrame 

    private static final long serialVersionUID = 1L;
    private JTree tree;

    public TreeWithTableRenderer() 
        DefaultMutableTreeNode AA1 = new DefaultMutableTreeNode("AA1");
        DefaultMutableTreeNode AA2 = new DefaultMutableTreeNode("AA2");
        DefaultMutableTreeNode A = new DefaultMutableTreeNode("A");
        A.add(AA1);
        A.add(AA2);
        DefaultMutableTreeNode BB1 = new DefaultMutableTreeNode("BB1");
        DefaultMutableTreeNode BB2 = new DefaultMutableTreeNode("BB2");
        DefaultMutableTreeNode B = new DefaultMutableTreeNode("B");
        B.add(BB1);
        B.add(BB2);
        DefaultMutableTreeNode CC1 = new DefaultMutableTreeNode("CC1");
        DefaultMutableTreeNode CC2 = new DefaultMutableTreeNode("CC2");
        DefaultMutableTreeNode C = new DefaultMutableTreeNode("C");
        C.add(CC1);
        C.add(CC2);
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
        root.add(A);
        root.add(B);
        root.add(C);
        tree = new JTree(root);
        tree.setCellRenderer(new MyTableInTreeCellRenderer());
        tree.setRowHeight(0);
        JScrollPane jsp = new JScrollPane(tree);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(jsp, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    

    class MyTableInTreeCellRenderer extends JPanel implements TreeCellRenderer 

        private static final long serialVersionUID = 1L;
        private JTable table;

        public MyTableInTreeCellRenderer() 
            super(new BorderLayout());
            table = new JTable();
            JScrollPane scrollPane = new JScrollPane(table);
            add(scrollPane);
        

        public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) 
            final String v = (String) ((DefaultMutableTreeNode) value).getUserObject();
            table.setModel(new DefaultTableModel() 

                private static final long serialVersionUID = 1L;

                @Override
                public int getRowCount() 
                    return 2;
                

                @Override
                public int getColumnCount() 
                    return 2;
                

                @Override
                public Object getValueAt(int row, int column) 
                    return v + ":" + row + ":" + column;
                
            );
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            return this;
        
    

    public static void main(String[] args) throws Exception 
        SwingUtilities.invokeLater(new Runnable() 

            public void run() 
                new TreeWithTableRenderer().setVisible(true);
            
        );
    

【讨论】:

感谢您的代码。我对其进行了一些修改以获得我的问题中的更新结果。我只是想知道我是否用最好的方法修改了什么? 但是表格不可编辑。如何编辑表格内容

以上是关于Jtable 作为 Jtree 节点的主要内容,如果未能解决你的问题,请参考以下文章

第六周学习总结

JTree 更新节点而不折叠

Java — JTree and JTable

JAVA 得到jtree 某节点下的子节点

JTree的使用(总结,非常简洁)

从 JTree 添加和删除节点