アプリ版:「スタンプのみでお礼する」機能のリリースについて

例えば、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();
 }
とする必要があるのかもしれません。


この正攻法が載っているようなサイト、本や資料等を
ご存知でしたらご教示ください。

A 回答 (2件)

JComponentをextendsするのは、ふつう、カスタムコンポーネントを作るときですね。

それ以外では意味がないばかりか、使いようがないでしょ。むりやり使うとしたら、このオブジェクトを使うコンテナのadd()メソッドまでオーバライドしなければならないから、もお~~たいへん!。それを避けるためにJComponentにJButtonのUI体系とイベント体系をすべて完全に再演させるとしたら、もお~~の二乗三乗ぐらいたいへん!!

Blochが何と言おうと、これぐらいの簡単なやつは、extends JButtonでgetInt()でも定義すれば十分。ていうか、それすら不要です。
    • good
    • 0

現在のおたくの


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()メソッドは定義できない
という意味であげた単なる例です。

補足日時:2008/11/30 11:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!