• 締切済み

JComponentを継承して処理をJButtonに委譲

例えば、JButtonのメソッドの仕様を  int getText();  void setText( int value ); と、変更したい場合を考えます。 このとき、 public IntegerButton extends JComponent {    JButton delegator;    public IntegerButton(int value, Icon icon) {   delegator = new JButton(Integer.toString(value), icon);   setLayout(new BorderLayout());   add(delegator);  }    public int getText() {   return Integer.parseInt(delegator.getText());  }  public void setText(int value) {   delegator.setText(Integer.toString(value));  }      //委譲メソッド  public void addMouseListener(MouseListener ml) {   delegator.addMouseListener(ml);  }  public void removeMouseListener(MouseListener ml) {   delegator.removeMouseListener(ml);  }     } という感じで書くことになると思うのですが、疑問なのは JComponent,AbstractButton等継承しているクラスの中の、 どのメソッドを転送する必要があるのかが不明なことです。 addMouseListener(MouseListener ml)は委譲する必要があると 思うのですが、逆にpaint(Graphics g)を委譲すると 上手くいかなくなります。 また、requestFocusInWindow()に関しては、  public boolean requestFocusInWindow() {   super.requestFocusInWindow();   return delegator.requestFocusInWindow();  } とする必要があるのかもしれません。 この正攻法が載っているようなサイト、本や資料等を ご存知でしたらご教示ください。

みんなの回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

JComponentをextendsするのは、ふつう、カスタムコンポーネントを作るときですね。それ以外では意味がないばかりか、使いようがないでしょ。むりやり使うとしたら、このオブジェクトを使うコンテナのadd()メソッドまでオーバライドしなければならないから、もお~~たいへん!。それを避けるためにJComponentにJButtonのUI体系とイベント体系をすべて完全に再演させるとしたら、もお~~の二乗三乗ぐらいたいへん!! Blochが何と言おうと、これぐらいの簡単なやつは、extends JButtonでgetInt()でも定義すれば十分。ていうか、それすら不要です。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

現在のおたくの extends JComponent では、クラスにJComponentとしての実体がまったくないので、おかしいだけでなく、非常に使いづらいクラスになります。むしろ、JButtonのメソッドを増やしたいだけなら、 extends JButton だけで十分です。 もうすこしプロフェッショナルに言えば、  int getText();  void setText( int value ); たかがこの程度のメソッドを設けるために拡張クラスを作るのは、おおげさで不経済です。単純にJButtonのインスタンスをアプリ中で使えば十分です。StringのgetText()の結果をintに変換するのも、またintをStringに変換してsetText()するのも、新たにメソッドを作るほどの処理ではありません。

ggable
質問者

補足

>extends JComponent >では、クラスにJComponentとしての実体がまったくないので、おかしいだけでなく、 どういう意味でしょう。  public class JPanel extends JComponent implements Accessible  public class JScrollPane extends JComponent implements ScrollPaneConstants, Accessible ご存知とは思いますが、JPanelもJScrollPaneも当然JComponentを継承しています。 >もうすこしプロフェッショナルに言えば、 > int getText(); > void setText( int value ); >たかがこの程度のメソッドを設けるために拡張クラスを作るのは、おおげさで不経済です。 不経済かどうかなんて問題ではなく、論理的に継承が向いているか、 コンポジション実装が向いているかの問題でしょう。 Effective Java 4章項目14にも「継承よりもコンポジションを選ぶ」とあります。 >たかがこの程度のメソッドを設けるために拡張クラスを作るのは、 言うまでもなく、これが実現したいことではないですよ。 JComponentの継承の正しい方法が知りたいということです。 String getText()メソッドがJButtonクラスには定義されているので、 JButtonクラスを継承しては、int getText()メソッドは定義できない という意味であげた単なる例です。

関連するQ&A