4

各ノードに 2 つのチェックボックスとラベルを含む JTree が必要な珍しい状況があります (潜在的なチェックボックスがいつチェックされるかを通知するリスナーを追加する機能を備えています)。また、ルート ノードに同じレイアウト (2 つの JCheckBoxes と JLabel を持つ JPanel を作成することを意味すると想定しています) を持たせ、ルートにある 1 つがチェックされている場合はツリーの下にあるすべてのチェックボックスを選択できるようにする必要があります。

ガイダンスや例はありますか?ここで以前の質問と関連する例を確認しました...そのうちのいくつかは、ツリーを「見る」ようにすることを可能にしましたが、その背後にあるアクションを実装するための指示を与えませんでした。

ありがとう!

4

3 に答える 3

5

これは、最初の列にレンダリングされたツリーと、必要に応じてツリーノードの右側に各列のセルを自由にレンダリングできる古いJTreeTableコードを確認する良い機会かもしれません。チェックボックスとラベルを配置し、TableCellEditorsを以前のようにJTableで動作させることができます。警告は、そのリンクのコードは機能しますが、少し複雑であるということです。

別の方法があります。NetBeansによって提供される、より優れていると思われるツリーテーブルの実装を以下にデモしましたOutline(NetBeans IDEで開発する必要はありませんが、jarが必要です)。 この記事は、始めるのがいかに簡単かを示しています。

Eclipseのアウトラインツリーテーブルの簡単な例を(プロジェクトにインポートされたorg-netbeans-swing-outline.jarを使用して)約30分でモックアップすることができました(入力が遅い):

private void buildFrame() {
    frame = new JFrame("Demo");
    frame.setSize(300, 300);
    addStuffToFrame();
    frame.setVisible(true);

}


private void addStuffToFrame() {
    MyTreeNode top = new MyTreeNode("top");
    createNodes(top);
    DefaultTreeModel model = new DefaultTreeModel(top);     
    //here are the netBeans tree table classes 
    OutlineModel outlineModel = 
             DefaultOutlineModel.createOutlineModel(model, new MyRowModel());
    Outline outline = new Outline();
    outline.setRootVisible(true);
    outline.setModel(outlineModel);
    frame.getContentPane().add(new JScrollPane(outline));
}

private void createNodes(MyTreeNode top) {
    MyTreeNode child = new MyTreeNode("child 2");
    top.add(new MyTreeNode("child 1"));
    child.add(new MyTreeNode("g-child1"));
    child.add(new MyTreeNode("g-child2"));
    child.add(new MyTreeNode("g-child3"));
    top.add(child);
    top.add(new MyTreeNode("child3"));
    top.add(new MyTreeNode("child4"));

}

の組み込みチェックボックスレンダリングメカニズム Booleanとうまく相互運用するsを保持するTreeNodeを作成します。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 RowModelは、これを単純な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);
        }


    }

}

単純ではありますが、完成した製品は次のとおりです。

代替テキストhttp://img17.imageshack.us/img17/6643/picture1hz.png

ノードの子を反復処理するようにメソッドを更新しsetValueFor、親が変更されたときにチェックボックスを選択または選択解除に設定しました。

于 2009-09-17T02:43:16.550 に答える
1

http://www.java2s.com/Code/Java/Swing-JFC/CheckBoxNodeTreeSample.htmをご覧ください。

于 2009-09-17T01:45:25.220 に答える
0

buildFrame()、addStuffToFrame()、および createNodes() メソッドがどこに行くのかは明確ではありませんでした。それらをすべて、JFrame を拡張して作成した OutlineJFrame クラスに入れ、「フレーム」を削除しました。それが現れたところはどこでも序文。次に、私のプロジェクトの main() メソッドで、これらの OutlineJFrame オブジェクトの 1 つを作成し、その可視性を true に設定しました。実行すると、サイズ変更可能だが空のウィンドウが表示されました。行はどこにありましたか?ノードはどこにありましたか?

次に、NetBeans の第一人者である Geertjan に、私が間違っていたことを尋ねたところ、彼は書き直してくれました。しかし、それは同じ動作をしていました。

しかし、私が行った別のデモ プロジェクト (FileTreeJFrame) では、outline.java オブジェクトが問題なく表示されるため、私の Java が問題ないことはわかっています。

于 2009-12-13T19:01:29.623 に答える