2009-07-06 11 views
3

JTreeは、セルレンダラとしてDefaultTreeCellRendererを使用します。
このクラスはJLabelのサブクラスです。Swing:JTextPanesをノードとしてJTreeを使用するにはどうすればよいですか?

JTreeJLabelよりも複雑な要素、たとえば JTextPaneなどを使用したいとします。

問題:サブタイトルDefaultTreeCellRendererは、 がまだJLabelなので、サブクラス化できません。

自分自身を書くTreeCellRendererは複雑すぎます。
なぜですか?理由は:DefaultTreeCellRendererは17フィールドを持ち、 を実装し、TreeCellRenderergetTreeCellRendererComponent(...)を実装するだけではありません。

どのような簡単な解決方法がありますか?

複雑な書式設定を行うには、ツリー要素をJTextPaneにする必要があります。

+0

JTextPaneには何が必要ですか? – Peter

+0

インターフェイスを実装する必要があります。あまりにも厳しくはありません。実際、私はそれのようなGUIのもので混乱するのが楽しいと思う。 – jjnguy

答えて

0

DefaultTreeCellRendererをサブクラス化し、getTreeCellRendererComponentメソッドだけをオーバーライドして、JTextPaneコンポーネントを望むように返すことができます。 DefaultTreeCellRendererの実装ではまだ多くのことを行う必要がありますが、これらのフィールドのメンテナンス面を気にする必要はありません。あなたはデフォルトの実装のような複雑にする必要はありません

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 

    // do stuff to this instance of JTextPane 
    setEditable(selected); 
    setText(value.toString()); //Assumes whatever you stuck in the tree has pretty toString 

    if (leaf) 
     setBackgroundColor(Color.RED); 
    return this; 
} 

編集はコメントを読ん

+0

いいえ、それはセルエディタです。このために、素朴な抽象クラスAbstractCellEditor –

1
public class JTextPaneTreeCellRenderer extends JTextPane implements TreeCellRenderer { 

法後のJTextFieldエディタソリューションを削除しました。 RenedereをJTextPaneのサブクラスにすると、メソッドの実装がはるかに簡単になります。

+0

があります。あなたはまた、このようにするのがよりクリーンであると主張することもできます。 – akf

関連する問題