- 締切済み
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(); } とする必要があるのかもしれません。 この正攻法が載っているようなサイト、本や資料等を ご存知でしたらご教示ください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- _ranco_
- ベストアンサー率58% (126/214)
JComponentをextendsするのは、ふつう、カスタムコンポーネントを作るときですね。それ以外では意味がないばかりか、使いようがないでしょ。むりやり使うとしたら、このオブジェクトを使うコンテナのadd()メソッドまでオーバライドしなければならないから、もお~~たいへん!。それを避けるためにJComponentにJButtonのUI体系とイベント体系をすべて完全に再演させるとしたら、もお~~の二乗三乗ぐらいたいへん!! Blochが何と言おうと、これぐらいの簡単なやつは、extends JButtonでgetInt()でも定義すれば十分。ていうか、それすら不要です。
- _ranco_
- ベストアンサー率58% (126/214)
現在のおたくの extends JComponent では、クラスにJComponentとしての実体がまったくないので、おかしいだけでなく、非常に使いづらいクラスになります。むしろ、JButtonのメソッドを増やしたいだけなら、 extends JButton だけで十分です。 もうすこしプロフェッショナルに言えば、 int getText(); void setText( int value ); たかがこの程度のメソッドを設けるために拡張クラスを作るのは、おおげさで不経済です。単純にJButtonのインスタンスをアプリ中で使えば十分です。StringのgetText()の結果をintに変換するのも、またintをStringに変換してsetText()するのも、新たにメソッドを作るほどの処理ではありません。
補足
>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()メソッドは定義できない という意味であげた単なる例です。