3

ツリー内のノードの表示文字列をオプションで変更することをサポートDefaultTreeModelするオーバーライドが設定されたを使用しています。DefaultMutableTreeNode以下のコードに示すように、私のフォームでは、新しいノードを別のクラスで作成し、メイン データ型のラッパー クラスを介して渡すことで、ツリーに新しいノードを設定します。新しいオーバーライドされた を作成し、そこDefaultMutableTreeNodeに子を追加し (それぞれAccessPointが複数の子ノードを持つノードで表されます)、後で UI で使用するために保存する手順があります。

この方法で初めてノードを追加すると、うまく機能します。次のコードで追加された後続のノードは、実際には に保存されますDefaultTreeModelが、JTreeは新しいノードで更新されません。

JTree最初の子が追加された後にデータが入力されないのはなぜですか?

private void populateAccessPointTreeModel(AccessPointDataWrapper wrapper) {
    //the pre-created DefaultMutableTreeNode subclass instance is
    // stored in the wrapper
    DefaultMutableTreeNode accessPointNode =
            wrapper.getAccessPointTreeNode();
    //this line updates the accessPointTree with the new node (I've looked at the
    // value in debug mode, and it does in fact add the node
    ((DefaultMutableTreeNode) accessPointTree.getRoot()).add(accessPointNode);
    //unrelated logic happens down here...
}

必要に応じてノードを作成するコードを含めることができますが、それは問題ではないと思います。

4

2 に答える 2

7

問題は、その子が更新されたことを にDefaultMutableTreeNode通知しないことです。DefaultTreeModelこれを行うには、テーブル モデル (nodesChangedまたは同様の) で適切なメソッドを呼び出すか、(できれば)DefaultTreeModel.insertNodesIntoメソッドを使用します。

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());
于 2011-07-26T14:40:24.620 に答える
0

スレッドの問題が発生している可能性があります。更新されるJTreeはいくつかのスレッドですが、Swingイベントディスパッチスレッド(EDT)に表示されるJTreeの重要なコピーは、これらの変更について何も知りません。

この場合、以下を使用してSwingEDTのJTreeを更新する必要があります。

SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() { ... update jTree here }
});

JTreeについてはわかりません...SwingEDTで更新する必要があるのはTreeModelかもしれません。

于 2011-07-26T14:26:51.283 に答える