2

私が書いているプログラムには、自分のデザインのオブジェクトを格納するJTreeがあります。DefaultTreeCellRendererの独自の拡張を作成し、getTreeCellRendererComponentをオーバーライドして、いくつかのボタンなどを含むJPanelを返しました。私が見つけたのは、追加したボタンがボタンのように機能しないことでした。これにより、コンポーネントとの相互作用がツリーセルによって「盗まれた」と思われます。(ボタンをクリックすると、ボタンを囲むコンテナもクリックされ、ツリーはクリックに対して独自の応答を示します。)

だから私の質問はこれです:

ツリーの基本的な機能といくつかのボタンが必要な場合、どのようなアプローチを使用する必要がありますか?

  • 同じルートを続けます。ある種のマウスリスナーを追加して、ボタンに機能を手動で追加します。
  • 同じルートを続けます。既存のマウスリスナーを削除し、独自のマウスリスナーを追加して、適切な動作を実現します。
  • 行ったものとは少し異なるクラスまたはインターフェースを拡張または実装します(DefaultMutableTreeNodesではない場合、DefaultTreeCellRendererではない場合など)。既存のXXXXを使用して、実行しようとしていることを実行します。
  • JTreeの使用は避けてください。あなた自身のものを作ってください、それはそれほど難しいことではありません。

私は最後のオプションに傾いています-とにかく木の折り畳み動作を実際に望まない可能性が十分にあるので、私は自分自身の構造を作ることができます。しかし、そのオプションを選んだとしても、どうしたらいいのか知りたいです。

4

2 に答える 2

4

ここTreeCellEditorに示されている、も必要です。

于 2012-07-25T01:45:00.333 に答える
3

JTreeの使用は避けてください。自分で作る、それはそれほど難しいことではありません

私はあなたにそれで幸運を祈ります;-)

何が起こっているのかというと、レンダラーによって返されるコンポーネントは「スタンプ」としてのみ使用されます。したがって、JTree実際には返されたコンポーネントは含まれていません。ペイントされているだけです。したがって、ボタンとの相互作用はありません。ボタンのように見えるだけです。チュートリアルにはこれに関する実際のセクションが含まれていないようですJTreeが、基本的にはテーブルの場合と同じ概念であり、チュートリアルの「レンダラーとエディター」の部分で説明されています。

これは、典型的なレンダラークラスが拡張され、ツリー内の他のノードに影響を与えることなく、それ自体をカスタマイズした後にJLabel簡単に使用できる理由も説明しています。return thisたとえばDefaultTreeCellRenderer、を拡張するのソースコードにはJLabel、が含まれています

public Component getTreeCellRendererComponent(JTree tree, Object value,
                                              boolean sel,
                                              boolean expanded,
                                              boolean leaf, int row,
                                              boolean hasFocus) {
   //...
   setText(stringValue);
   //...
   return this;
}

これを修正する方法:@trashgodによって提案されたように、エディターも作成します

于 2012-07-25T06:01:25.790 に答える