問題タブ [jtree]
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 - Java TreeNode:getChildCountが高価な操作を行うのを防ぐ方法は?
ツリー ノードが計算に時間がかかる子を持つ可能性がある Java ツリーを作成しています (この場合はファイル システムであり、接続されたドライブからファイルのリストを取得できないネットワーク タイムアウトが発生する可能性があります)。
私が見つけている問題はこれです:
getChildCount()
ユーザーがツリーの特定のブランチを開くことを具体的に要求する前に呼び出されます。JTree
ノードの横に + アイコンを表示するかどうかがわかるように、これが行われていると思います。からの子の正確な数は
getChildCount()
、潜在的に高価な操作を実行する必要がありますの値を偽造すると
getChildCount()
、ツリーは子の列挙を要求する前に、その数の子ノードにのみスペースを割り当てます。(「1」を返すと、さらに多くの子供がいるにもかかわらず、1 人の子供しか表示されません)
子の列挙には費用と時間がかかる可能性がありますが、それは問題ありません。しかし、私はgetChildCount()
子供の正確な数を知る必要があることに満足していません.
これを回避する方法はありますか?
追加:もう 1 つの問題は、ノードの 1 つがフロッピー ドライブを表している場合 (なんと古いことでしょう!)、ユーザーがファイルを要求する前にドライブがポーリングされることです。ドライブにディスクがない場合、システム エラーが発生します。
更新:残念ながら、TreeWillExpand
リスナーを実装することは解決策ではありません。これにより、拡張を拒否することができますが、表示されるノードの数は、 によって返される値によって依然として制限されTreeNode.getChildCount()
ます。
java - JTree のツールチップを実装する最良の方法は?
JTree と TreeModel はすぐに使用できるツールチップを提供しないため、JTree のアイテム固有のツールチップを表示するにはどうすればよいと思いますか?
編集:(後で自分の質問に答えます。)
@Zarkonnen: getTooltipText のアイデアをありがとう。
DefaultTreeCellRenderer をオーバーライドする別の (おそらくもう少し良い) 方法を見つけ、それを共有することを考えました:
memory-management - The Big Tree: RIA でデータをリリースするタイミング
この質問は、Java JTree または Window .Net Tree (Winforms) または Adobe Flex Tree に関するものです。
クライアント/サーバー アプリケーション (Flex の場合、実際には Web です) には、階層データを含むツリーがあります (Windows Explorer タイプのインターフェイス内)。現在、ユーザーがサーバーからより多くのデータを要求すると、ツリーを遅延ロードします。これは問題なく、約 750K ノード (.Net Winforms および Adobe Flex で経験的にテスト済み) までは機能しますが、その後は遅くなります。しかし、データベースは急速に拡大し (主に、ユーザーが大量のノードを貼り付けることができるため)、2,000 万ノードのデータベースはまったくありそうもないことではありません。
ガベージ コレクターがメモリを解放できるように、ブランチが折りたたまれているときにツリーからデータを解放する必要がありますか? これは問題ありませんが、ユーザーが効率的でなく、ブランチを折りたたまない場合はどうなるでしょうか? しばらく触れられていないブランチを閉じるメモリ管理モジュールを実行する必要がありますか?
メモリ不足にならないようにするには、これはすべて大変な作業のように思えます。
編集:ノードの崩壊時にデータを解放する必要がありますか? もしそうなら、いつ?弱いオブジェクト キャッシュのアイデアは良いですが、UI が壊れるまで引き続き UI をいっぱいにする必要がありますか (それは悪いアイデアではないかもしれません)。
java - JTree の複数のルートに展開アイコンを表示する方法はありますか?
複数の「ルート」を持つ JTree があります (もちろん、実際には複数の子を持つ目に見えない実際のルートがあります)。
ノードはダブルクリックで展開したり折りたたんだりできますが、展開アイコンがないため、これを実行できることを視覚的に示すものはありません。
これは、ツリーがデフォルトで折りたたまれているという事実によってさらに悪化しますが、「ルート」を展開しても実際には役に立ちません。それぞれに多くの子があり、雑然と見えるからです。
実際の (そしてまったく価値のない) ルートを表示せずに、エキスパンダー アイコンを表示する方法はありますか?
表示をより明確にするためのその他の提案は大歓迎です。
java - JTreeはArrayIndexOutOfBoundsExceptionを与えますか?
Java Swingにノードを動的に追加しようとするJTree
と、ノードが絶えず追加されている間、ユーザーは階層を参照して折りたたむことができるはずです。Thread.sleep(10)
ループにを追加すると、正常に機能します。しかし、これは汚いハックです...
これは、この問題を引き起こす簡略化されたコードです。これを実行し、ルートノードをダブルクリックして展開/折りたたむと(ノードが追加されている間)、が表示されArrayIndexOutOfBoundsException
ます。これを追加しても、Thread.sleep(10)
これは発生しません。これはスレッドの問題だと思いますが、これを同期する方法がわかりませんか?ヒントをいただければ幸いです。
これをタイピング中の検索アプリケーションに使用したいので、(ほぼ)即座に結果を出すことが私にとって不可欠です。
編集:迅速な回答をありがとう!SwingUtilities.invokeLater()
問題を解決します。
私は今これをします:
- 内に100個のアイテムを追加します
SwingUtilities.invokeLater();
100項目後、GUIを更新できるように、これを実行します。
/li>
このように、私は非常に応答性の高いGUIを使用しており、完全に機能します。ありがとう!
java - Java JTree はレベル 1 ノードのみを展開します
JTree では、ルート ノードがレベル 0 であり、ルートの下に最大 5 レベルあると仮定すると、レベル 1 のすべてのノードを簡単に展開して、レベル 1 と 2 のすべてのブランチとリーフが表示されますが、レベル 3 以下は表示されます。そうじゃない?
java - Java JTreeのコンテキストメニューを右クリックしますか?
JavaJTreeにポップアップメニューを実装しようとしています。DefaultTreeCellRenderer(ノードの外観を変更するため)とDefaultTreeCellEditor(イベントリスナーをアタッチするコンポーネントを作成するため)をサブクラス化しました。これは、DefaultTreeCellRenderer.getTreeCellRendererComponent()が返すコンポーネントではできないためです)。ノードを「編集」したくはありません。ノードが右クリックされたときにメニューをポップアップできるようにするだけですが、これが今私が考えることができる唯一の方法です...
以下は私がこれまでに持っているコードです-私はMouseEventsをキャプチャする方法を理解しようとしています。それは一種の作品ですが、ひどいです。私がここでやろうとしていることを達成するためのより良い方法は何ですか?
java - (ファイルシステムツリー内の)JTreeキャッシングノードを停止できますか?
ファイルシステム内のディレクトリ用のJTree実装があります。私が抱えている問題は、ディレクトリが削除または名前変更された場合でも、ツリーにはその親のディレクトリが表示されることです。ノードが展開されると、親ツリーは変更に対して更新されないようです。
私が書いたモデルはキャッシュしません(それが持っていた制限されたキャッシュをコメントアウトしました)-それはJTree自体がノードをキャッシュしたようです。
コード(モデルはネストされたサブクラスです):
java - JTree の「ctrl」選択モードを常に有効に設定する方法
複数選択ロジックを実装する JTree があります。
これは、マウス + Ctrl キーを押してすべての選択を行うとうまく機能します。ユーザーが Ctrl キーを押していない状態で選択すると、ロジックが壊れます。
壊れる理由はよくわかりませんが、可能な解決策は、Ctrlキーを押した状態で選択が行われたことをTreeSelectionModelに常に示すことだと思います。
何を提案しますか?