3

JTree子がないにもかかわらず、ノードの一部を拡張可能として表示するようにカスタム化して、を作成しました(まだ)。私はそれを実装するためにこのスレッドに従いました。

なんで?ツリーを動的にロードしたいので、ツリーが展開されたときに、サーバーからさらに情報を取得してツリーに表示します。

私が経験している問題は、これらのノードの1つを展開すると、それが選択されることです。これは、デフォルトノードのデフォルトの動作ではありません(ツリーの選択を変更せずに展開できます)。

このノードが拡張時に選択されるのを防ぐためにこれを解決するにはどうすればよいですか?

4

1 に答える 1

4

以下のコードではその問題は発生しません。コードを見なければ推測できない何か他のことをしているに違いありません。以下のコードを取得して変更し、発生している問題を再現してみてください。そうすることで、自分が何を異なって行っているか、なぜそのような振る舞いをするのかを見つける大きなチャンスがあります ( SSCCEも参照してください)。

コードはここから取得しました

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;

public class DynamicTree extends JFrame {

    public class OutlineNode extends DefaultMutableTreeNode {
        private boolean areChildrenDefined = false;
        private int outlineNum;
        private int numChildren;

        public OutlineNode(int outlineNum, int numChildren) {
            this.outlineNum = outlineNum;
            this.numChildren = numChildren;
        }

        @Override
        public boolean isLeaf() {
            return false;
        }

        @Override
        public int getChildCount() {
            if (!areChildrenDefined) {
                defineChildNodes();
            }
            return super.getChildCount();
        }

        private void defineChildNodes() {
            // You must set the flag before defining children if you
            // use "add" for the new children. Otherwise you get an infinite
            // recursive loop, since add results in a call to getChildCount.
            // However, you could use "insert" in such a case.
            areChildrenDefined = true;
            for (int i = 0; i < numChildren; i++) {
                add(new OutlineNode(i + 1, numChildren));
            }
        }

        @Override
        public String toString() {
            TreeNode parent = getParent();
            if (parent == null) {
                return String.valueOf(outlineNum);
            } else {
                return parent.toString() + "." + outlineNum;
            }
        }
    }

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

            @Override
            public void run() {
                new DynamicTree(5);
            }
        });
    }

    public DynamicTree(int n) {
        super("Creating a Dynamic JTree");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Container content = getContentPane();
        JTree tree = new JTree(new OutlineNode(1, n));
        content.add(new JScrollPane(tree), BorderLayout.CENTER);
        setSize(300, 475);
        setVisible(true);
    }
}
于 2012-05-10T08:29:58.683 に答える