1

私が取り組んでいるこのかなり大きなプロジェクト、グラフィックエディタがあり、スイングコンポーネントの操作でいくつかの大きな問題が発生しました。しかし、今ではプログラマーにとって最悪の悪夢があります。これは、たまにしか発生しないバグです。

JTree要素を追加するとき、または図()で選択されているときに要素を選択するときに、で要素を選択しようとすると、一部の要素JInternalFrameが展開されません。

私の構造は次のようなものです。プロジェクトと図を含むプロジェクトを含むワークスペースがあります。ダイアグラムは、私が持っているすべての要素、たとえば円、長方形などをフォルダーに保持します(それらが円の場合、それらは円フォルダーに配置されます...)。

もう1つ知っておくべきことは、setSelectedPath/Pathsのメソッドを使用して要素を選択することJTreeです。

私が何をし、何を試したかを理解するのに役立つかもしれないいくつかのこと:

  • ノードがルートに到達する方法を知っていることを確認しました。(getTreeModel.getPathToRoot良いパスを返します)
  • 樹木選択モデルと樹木に直接パスを追加してみました
  • expandsSelectedPathsをtrueに設定しました
  • ツリーを手動で展開すると(後で展開する場合でも)、問題の原因となったタイプの新しい要素を追加するまで、ノードが選択されます。
  • これは、5種類の要素を切り替えるときに約1回発生します。問題が発生した要素を追加した後で、他の種類の要素を追加しようとすると、奇妙なことが起こります。

これは非常に複雑な問題だと思いますが、誰かが何をすべきかを知ってくれることを願っています。あなたが私を助けるのを助けるかもしれない何かを尋ねてください。

4

2 に答える 2

4

OK、回答してくれた皆さんに感謝しますが、この問題の非常に簡単な回避策を見つけました。何らかの理由で、最後のパスコンポーネントがリーフの場合、拡張されていたものは効果がありません。

私がしたことは、単にリーフノードがメソッドに対してfalseを返すisLeafようにすることでしたが、私の問題はすべて解消されました。

于 2012-06-03T20:02:59.333 に答える
1
  • 正しい(、、、)addWhatever()JTree発射する場合TreeModelEventfireChildAdded()firePathChanged()fireChildrenLoaded()treeStructureChanged()

  • GUIのすべての変更はに移動されBackGround Task(s)ます。SwingWorkerまたはRunnable#Thread(最も明確で最も簡単な方法)を参照してください。ただし、Runnable#Threadすべての出力(Swingメソッド)をにラップする必要があります。invokeLater

于 2012-06-03T12:00:19.673 に答える