Jtable作为Jtree节点

8

我知道你可以创建一个表格并将JTree添加为列。但是我想做的完全相反。

查看图片并告诉我是否可能。谢谢!

enter image description here

更新:

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

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

我能够获得以下图像:

enter image description here


1
我还没有测试过,但为什么不可能呢?API请求渲染器返回一个组件。而JTable就是一个组件。在JTable中进行编辑/选择可能会更加困难。 - Robin
@Robin 但我的意思是从视觉上来看,它是否合适?会有任何困难吗? - Adel Boutros
现在这很有趣。我的观点是,如果您的表格很大,您的树可能看起来有点奇怪。此外,我很好奇您是否实际上能够与表格进行交互。它只是表格的图像吗? - user489041
@user489041 在我的情况下,我只是将其用作只读。但是将其变为可编辑的会很有趣... - Adel Boutros
这个带有JTable的JTree节点看起来与您的图片非常相似,将JPanel放置在其中--> JScrollPane --> JTable,如果JTree是可编辑的,则您也可以编辑JTable中的单元格,+1好问题。 - mKorbel
1个回答

7

1)我不知道该如何在 RendererEditor 中解决 isLeaf()

2)如果我直接将带有 JTableJScrollPane 放到 Node 中(不使用 JPanel 作为 parent),则在启动后 JTree View 渲染不正确,更多信息请参见我的问题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);
            }
        });
    }
}

谢谢你的代码。我稍微修改了一下,以获得我问题中的更新结果。我只是想知道我修改的部分是否是最好的方法? - Adel Boutros
但是这个表格不可编辑。如何编辑表格的内容? - Madhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接