3


私はJTreesとJavaを学んでいます。
建設的な提案やフィードバックは大歓迎です。

私はJTreesの理解が不足していると思います。そして、5時間グーグルして、テストして行き詰まっています。コードを可能な限り単純化しました。

        public void actionPerformed(ActionEvent event) {
            MyNode selNode = (MyNode) m_tree.getLastSelectedPathComponent();
            if (selNode != null) {
                MyNode newNode = new MyNode("New Node");
                model.insertNodeInto(newNode, selNode,
                        selNode.getChildCount());
                MyNode[] nodes = model.getPathToRoot(newNode);
                TreePath path = new TreePath(nodes);
                m_tree.scrollPathToVisible(path);
                m_tree.setSelectionPath(path);
                // *******   The next line throws the exception shown below.  ****
                m_tree.startEditingAtPath(path);
            }


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI.startEditing(BasicTreeUI.java:2059)
at javax.swing.plaf.basic.BasicTreeUI.startEditingAtPath(BasicTreeUI.java:601)
at javax.swing.JTree.startEditingAtPath(JTree.java:2349)
at ItemCreator.ItemCreator$1.actionPerformed(ItemCreator.java:74)

コード-MySimpleMutable JTree

1)JTreeに新しいノードを追加すると、コードはスレッド"AWT-EventQueue-0"java.lang.NullPointerExceptionで例外をスローします。

2)一般的な建設的なフィードバックは大歓迎です。

敬具

4

1 に答える 1

2

問題はstartEditingPathではなく、誤ったモデルの実装です。基本的に、変更についてリスナーに通知できません。その結果、UIは、追加されたノードを含めるために内部を更新する機会がありません。

モデルは失敗します

  1. リスナーを受け入れない(addTreeModelListenerの空の実装)
  2. 変更後に発砲しようとさえしません(挿入、更新...)
  3. getPathToRootの実装が正しくありません

それは完全に些細なことではなく、Java docは(穏やかに言えば)少し混乱します-そのため、SwingXには十分にテストされたユーティリティクラスTreeModelSupportがあり、負担を引き継ぎます。スタンドアロンで使用することも、ハウツーの青写真として使用することもできます。

カスタムモデルでは、いくつかの関連する変更(不完全、他の変更方法はそれに応じて修正する必要があり、リスナーを削除する必要があります):

// prepare fix issue 1: instantiate the notification support    
private TreeModelSupport support;

public ItemTreeModel(MyNode root) {
    this.root = root;
    support = new TreeModelSupport(this);
    // remove the following: a model never listens to itself
    // this.addTreeModelListener(new MyTreeModelListener());
}

// fix issue 1: accept listener
public void addTreeModelListener(TreeModelListener l) {
    support.addTreeModelListener(l);
}

// fix issue 2: notify the listeners on inserts
public void insertNodeInto(final MyNode newNode, final MyNode selNode,
        final int childCount) {
    selNode.add(childCount, newNode);
    newNode.setLocation(selNode);
    support.fireChildAdded(new TreePath(getPathToRoot(selNode)),
            childCount, newNode);
}

// fix issue 3: pathToRoot as needed in TreePath 
public MyNode[] getPathToRoot(MyNode node) {
    ArrayList<MyNode> itemArrayList = new ArrayList<MyNode>();
    // TODO - Add root node ?
    // yes, certainly - please read the java doc for TreePath
    while ((node != null)) { // && (node != root)) {
        itemArrayList.add(0, node);
        node = node.getLocation();
    }
    return itemArrayList
            .toArray(new MyNode[itemArrayList.size()]);
}
于 2012-11-15T10:53:05.130 に答える