Java 使用JCheckBox帮助制作JTree

Java 使用JCheckBox帮助制作JTree,java,swing,checkbox,jtree,Java,Swing,Checkbox,Jtree,我有一个不寻常的情况,我需要有一个JTree,每个节点包含2个复选框和一个标签(能够添加一个侦听器来告诉何时选中了任何潜在的复选框)。我还需要根节点具有相同的布局(我假设这意味着创建一个包含2个jcheckbox和一个JLabel的JPanel),如果选中根节点中的一个复选框,则能够选择树下的所有复选框 有什么指导或例子吗?我已经检查了前面关于这里的问题和相关的例子……其中一些让我达到了让树“看”的目的,但没有给我一个执行背后操作的方向 谢谢 看一看这可能是查看旧代码的好时机,它将为您提供在第一

我有一个不寻常的情况,我需要有一个JTree,每个节点包含2个复选框和一个标签(能够添加一个侦听器来告诉何时选中了任何潜在的复选框)。我还需要根节点具有相同的布局(我假设这意味着创建一个包含2个jcheckbox和一个JLabel的JPanel),如果选中根节点中的一个复选框,则能够选择树下的所有复选框

有什么指导或例子吗?我已经检查了前面关于这里的问题和相关的例子……其中一些让我达到了让树“看”的目的,但没有给我一个执行背后操作的方向


谢谢

看一看

这可能是查看旧代码的好时机,它将为您提供在第一列中渲染的树,以及根据需要在树节点右侧渲染每列的单元格的自由,在您的情况下,放入复选框和标签,并允许TableCellEditor按照习惯使用JTable。警告是,虽然该链接中的代码可以工作,但它有点复杂

还有一种选择。我在下面演示了一个树表实现,它应该更好,叫做
Outline
,由NetBeans提供(虽然您不需要使用netbeanside开发,但只需要jar)。指示开始有多容易

我能够在大约30分钟内模拟Eclipse中大纲树表的一个快速示例(将org-netbeans-swing-Outline.jar导入到我的项目中)(我打字很慢):

我创建了一个树节点来保存
Boolean
s,它将与
JTable
的内置复选框呈现机制进行良好的互操作

public class MyTreeNode extends DefaultMutableTreeNode {
    Boolean data1 = null;
    Boolean data2 = null;
    String name = null;
    MyTreeNode (String name) {
        this.name=name;
    }

    void setData1(Boolean val) {data1=val;}
    void setData2(Boolean val) {data2=val;}
    Boolean getData1() {return data1;}
    Boolean getData2() {return data2;}
    String getName() {return name;}

}
netBeans行模型是使其成为表而不是简单JTree的关键:

public class MyRowModel implements RowModel {

    public Class getColumnClass(int col) {
        switch (col) {
        case 0: return String.class;
        case 1: return Boolean.class; //these return class definitions will
        case 2: return Boolean.class; //trigger the checkbox rendering
        default:return null;    
        }
    }

    public int getColumnCount() {
        return 3;
    }

    public String getColumnName(int col) {
        return "";
    }

    public Object getValueFor(Object node, int col) {
        MyTreeNode n = (MyTreeNode)node;
        switch (col) {
        case 0: return n.getName();
        case 1: return n.getData1();
        case 2: return n.getData2();
        default:return null;
        }
    }

    public boolean isCellEditable(Object node, int col) {
        return col > 0;
    }

    public void setValueFor(Object node, int col, Object val) {
        MyTreeNode n = (MyTreeNode)node;
        if (col == 1)      {n.setData1((Boolean)val);}
        else if (col == 2) {n.setData2((Boolean)val);}
        //EDIT:  here is a recursive method to set all children
        //       selected for one of the two checkboxes as it is 
        //       checked by the parent
        for (Enumeration children = n.children();
                       children.hasMoreElements(); ) {
            MyTreeNode child = (MyTreeNode) children.nextElement();
            setValueFor(child, col, val);
        }


    }

}
以下是成品(尽管过于简单):


我已经更新了
setValueFor
方法来迭代节点的子节点,并在修改父节点时将复选框设置为选中或取消选中。

不清楚buildFrame()、addStuffToFrame()和createNodes()方法的位置。我把它们都放进了我创建的一个OutlineJFrame类中,该类扩展了JFrame,并删除了“frame”。然后在我的项目的main()方法中,它只创建了一个OutlineJFrame对象,并将其visible设置为true。当它运行时,我得到了一个可调整大小但空的窗口。排在哪里?节点在哪里

然后我问NetBeans大师Geertjan我做错了什么,他给了我一封复信。但它也有同样的行为


但是我知道我的java很好,因为我做的另一个演示项目(FileTreeFrame)显示outline.java对象很好。

您仍然需要调用
addStuffToFrame()
方法。这就是设置
大纲
并添加到
JFrame
以供显示的东西。请注意,我在那里输入的方法仅用于演示应用程序。
public class MyRowModel implements RowModel {

    public Class getColumnClass(int col) {
        switch (col) {
        case 0: return String.class;
        case 1: return Boolean.class; //these return class definitions will
        case 2: return Boolean.class; //trigger the checkbox rendering
        default:return null;    
        }
    }

    public int getColumnCount() {
        return 3;
    }

    public String getColumnName(int col) {
        return "";
    }

    public Object getValueFor(Object node, int col) {
        MyTreeNode n = (MyTreeNode)node;
        switch (col) {
        case 0: return n.getName();
        case 1: return n.getData1();
        case 2: return n.getData2();
        default:return null;
        }
    }

    public boolean isCellEditable(Object node, int col) {
        return col > 0;
    }

    public void setValueFor(Object node, int col, Object val) {
        MyTreeNode n = (MyTreeNode)node;
        if (col == 1)      {n.setData1((Boolean)val);}
        else if (col == 2) {n.setData2((Boolean)val);}
        //EDIT:  here is a recursive method to set all children
        //       selected for one of the two checkboxes as it is 
        //       checked by the parent
        for (Enumeration children = n.children();
                       children.hasMoreElements(); ) {
            MyTreeNode child = (MyTreeNode) children.nextElement();
            setValueFor(child, col, val);
        }


    }

}