問題タブ [defaulttreemodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - テキスト ファイルのデータを使用して JTree を作成する
JTree
ファイルからデータを使用して作成するにはどうすればよい.txt
ですか? テキスト ファイルの形式は次のとおりです。
この.txt
ファイルには 700 行を超える行が含まれています。
java - 遅延読み込みを使用して JTree で展開/選択状態を復元する
サーバー上のファイル システムのセクションを反映するファイルの階層を表示するために使用される DefaultTreeModel に裏打ちされた JTree を含むアプリケーションがあります (これをクライアント アプリと呼びます)。また、クライアント アプリが表示する必要があるデータを提供するサーバー アプリケーションもあります (これをサーバー アプリと呼びます)。ユーザーが興味を持っている場合にのみファイルをツリーにロードする必要があるように、「子の遅延ロード」アプローチを使用しています。遅延読み込みアプローチ:
- 上書きします
treeWillExpand(TreeExpansionEvent evt)
- 選択パスを展開ノードの選択パスに設定しました。
- 次に、そのノードの子を要求するメッセージをサーバーに送信します。
- サーバーが応答すると、最後に選択されたパス コンポーネントが取得されます。
- 次に
DefaultTreeModel.insertNodeInto()
、返されたデータ ファイルごとに使用します。 - 最後に を呼び出します
DefaultTreeModel.nodeStructureChanged()
。
上記は正常に機能し、子の遅延読み込みに問題はありません。私の問題は、新しいデータがサーバーにアップロードされ、ツリーを更新して新しいデータを含めるだけでなく、展開状態と選択したノードをツリーを更新する前の状態に設定したいときに発生します(ユーザーが表示する新しいデータがあるという理由だけで、ツリー上でぎくしゃくすることはありません)。フローは次のとおりです。
- 新しいデータがサーバーにアップロードされます
- サーバー アプリはこのデータをアーカイブし、アップロードされたファイルに関する情報をデータベースに入力します。
- サーバー アプリは、新しいデータがアップロードされたことをクライアント アプリに通知します。
- クライアント アプリは、次を使用してツリーの展開状態を保存します。
JTree.getExpandedDescendants()
- クライアント アプリは、次を使用してツリーの選択パスを保存します。
JTree.getSelectionPath()
- クライアント アプリは、DefaultTreeModel からすべてのノードを削除します。
- クライアント アプリは、ルート ノードから始まるサーバーからのデータを要求します。
- クライアント アプリは、列挙内の各 TreePath の
JTree.getExpandedDescendants()
呼び出しから返されたツリー パス列挙をトラバースします。JTree.expandPath()
- クライアント アプリは、選択したツリー パスを設定します。
私の問題は、何を試してもツリーの GUI が更新されず、展開状態が反映されないことです。クライアントから送信されたデータの要求と、expandPath への各呼び出しに対するサーバーからのデータを含む応答を確認できるため、expandPath への呼び出しが機能していることがわかります。また、現在選択されているノードに関する情報を別のウィンドウに表示すると、正しく選択されたノードが表示されます。しかし残念なことに、GUI には以前の展開された状態ではなく、ルート ノード (展開された) とその子ノード (展開されていない) のみが表示されます。
私の質問は次のとおりです。データ モデルの更新の前後で GUI が同じままになるように、JTree の展開状態を復元するにはどうすればよいですか?
これらは私が試したことのいくつかです:
- 私と同様の設定のスレッドを見つけましたが、彼の問題はオーバーライドすることで解決されましたが
equals()
、hashCode()
それはうまくいきませんでした。 setExpandsSelectedPaths(true)
、nodeStructureChanged()
、などの展開を呼び出すさまざまな方法JTree.invalidate()
- 展開状態の保存にはさまざまなバリエーションがありますが、クライアント アプリとサーバー アプリの間で正しいデータがやり取りされていることがわかるため、展開状態が正しくないとは思いません。
これが私のSSCCEです:
ご協力いただきありがとうございます。
PS これは私の最初の質問です。
java - JTree でテキスト ファイルからツリー モデルを動的に設定する
私が直面している問題は、JTree のツリー モデルにあります。
ルート ノードを次のように定義しました。
アプリケーションの最初の起動時に、treeModel を作成してロードする必要があります。このために、次のような情報を含むファイル meta.txt を使用しています。
最初の列はレベルで、2 番目の列はツリーのノードです。この情報に基づいて、ツリー モデルを作成したいのですが、ここで障害に直面しています。
上記のノードをルート ノードに追加するために適用するロジックがわかりません。私が試したことにはすべて欠陥があるようです。ここでの問題は、レベル数が固定されていないことです。そのため、単純に if-else 構文を使用することはできません。次のコードを使用しています。
これはうまく機能しているようですが、これが正しいアプローチであるかどうか誰か教えてください。
java - フォーム ビルダーを使用した JTree
デフォルトの NetBeans 編集でフォームを作成し、そのjTree
上に を置きました。そこになんとなく「色」「スポーツ」「食」などの要素がまとまって生まれる。しかし、それは作成コードにはありません。それはどこから来て、どのように編集できますか...
私がjTree1.removeAll();
すべてを行っても、まだそこにあります...そして、新しいアイテムをjTreeに追加するための私のコードは機能していません。
jTree
実行時にコンテンツを編集できる必要があります。
java - 表示されていないときに TreeModel から JTree を登録解除する方法は?
JTree
実際にユーザーに表示されている間だけ聞く、TreeModel
または少なくとも対応するものが破棄されるとすぐに登録を解除するにはどうすればよいJFrame
ですか?
私が見る限り、 aJTree
がそのモデルから自身を登録解除する唯一のケースは、( を使用して) 新しいモデルを渡した場合ですsetModel(…)
。
これにより、モデルが別の場所から参照されている場合、ツリーがガベージ コレクションされません。例:ファイル システム ツリーのモデルを常に最新の状態にするために、TreeModel
を使用してを実装しました。WatchService
モデルのリスナーが 1 つであっても、WatchService
ファイル システムの変更についてモデルに通知し続ける必要があるため、ガベージ コレクションを実行することはできません。そのため、JTree
が表示されなくなったとしても、 から更新を取得する必要があるモデルによって引き続きメモリに保持されますがWatchService
、これはもはや必要ありません。
JTree
モデルへの登録と登録解除を行う新しいクラス拡張を作成するのが最善の方法だと思います。その場合、コンポーネントが表示または破棄されるときにどのメソッドが呼び出されますか? おそらくaddNotify()
そしてremoveNotify()
良い候補ですか?
java - insertNodeInto の後に JTree に変更が表示されない
データがロードされているときにデータを入力する必要がある JTree があります。DefaultTreeModel でツリーを作成します
root は MutableTreeNode 実装です。表示する必要があるデータが変更または追加されると、リスナーがトリガーされます。
デバッガーは、挿入が呼び出されたことを示していますが、ツリー自体は変更を反映していません。私が呼び出すとreload()
、ツリーが描画されますが、すべてのノードも折りたたまれます。モデルが変更され、ノードが正しく追加されます。私が見逃しているのは何ですか?
java - DefaultTreeModel で nodesWereInserted() および同様のメソッドを呼び出す必要がありますか?
DefaultTreeModelでは、メソッドを使用してノードを挿入できますinsertNodeInto()
。nodesWereInserted()
ただし、この非常に簡潔な Javadoc を持つメソッドも存在することに気付きました。
いくつかの TreeNode をノードに挿入した後で、このメソッドを呼び出します。
これがパブリックメソッドであることは非常に奇妙です。リスナーに対して ChangeEvents を起動する場合、それは によって呼び出されるプライベート メソッドである必要がありinsertNodeInto()
ます。別のメソッドによって呼び出された変更を通知するためにメソッドを呼び出すことは、Java Swing の設計方法と多少矛盾しているようです ( elementIsInserted()
JComboBox に要素を追加するときにメソッドを呼び出しません)。
nodesWereInserted()
しかし、私のコードでは、 afterを呼び出しても問題ないことがわかりましたinsertNodeInto()
。どちらの方法でも、ノードがツリーに追加されて GUI に表示され、結果は同じになります。
nodesWereInserted()
DefaultTreeModelで同様のメソッドを呼び出す必要があるかどうかを誰かが説明してもらえますか? もしそうなら、なぜですか?insertNodeInto()
単独ではできないことは何ですか?
java - JTree 表示の問題
私はJavaについてあまり知りません。このコードは JTree で書きましたが、プログラム JTree を実行すると、最後の fList だけが表示されます。JTree がそれらすべてを表示するように、コードに追加できるものはありますか? JTreeCode は、同じパッケージ内の別のクラスです。