これが私の問題です。使用がjtreeツリーノードのアイコンとアイコンのみをクリックしたときにポップアップダイアログがトリガーされるようにしたい。私はいくつかの調査を行いましたが、アイコンにマウスリスナーを追加する既存の方法は見つかりませんでした(ある場合はお知らせください!)。したがって、私はそれにハックして、mouseevent.getPoint()から取得できるPointオブジェクトを使用して、マウスがアイコン上にあるかどうかを判断することにしました。ただし、Jtree.getCellRenct(row、col、includespacing)を呼び出すと、取得する場所は子ノードのインデントに関連しているように見えます。例えば、
親
-子供1
-子供2
3つのノードすべてでgetCellRect()を呼び出すことで、同じx座標を取得しますが、実際に必要なのは、xと "-"によって生じるインデントです。これは、mouseevent.getpoint()がインデントに相対的ではないためです。
どうすればこれができるのでしょうか?
編集:
私は方法を見つけました。tree.getUIを呼び出してBasicTreeUIオブジェクトを取得し、BasicTreeUI.getLeftChildIndent()とBasicTreeUI.getRightChildIndent()を呼び出します。これらの2つの整数を合計すると、ツリーのレベルごとのインデントの合計になります(またはこれまでのところのようです)。だから私はインデントを計算します
(path.getPathCount() - 1) * (leftindent + rightindent).
これが良いかどうかは完全にはわかりませんが、これまでのところうまくいきます。たとえば、左右のインデントが何を意味するのかはよくわかりません。また、BasicTreeUIのソースには、実際には保護されたメソッドがあります
protected int getRowX(int row, int depth)
{
return totalChildIndent * (depth + depthOffset);
}
このメソッドは、場所がツリーの展開または折りたたみアイコンの領域内にあるかどうかを確認するために使用される別の保護されたメソッドによって呼び出されるようです。私はdepthOffsetが何のためにあるのかについて多くを理解することができませんでした。ルートが表示されるか、似たような性質のものかと関係があると思います。
しかし、それでも私はこの方法でそれを行うのはあまり快適ではありません..誰かが私が良いと私に言うか、これを行うためのより良い方法があると言うことができますか?:-)