例えば、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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
JComponentをextendsするのは、ふつう、カスタムコンポーネントを作るときですね。
それ以外では意味がないばかりか、使いようがないでしょ。むりやり使うとしたら、このオブジェクトを使うコンテナのadd()メソッドまでオーバライドしなければならないから、もお~~たいへん!。それを避けるためにJComponentにJButtonのUI体系とイベント体系をすべて完全に再演させるとしたら、もお~~の二乗三乗ぐらいたいへん!!Blochが何と言おうと、これぐらいの簡単なやつは、extends JButtonでgetInt()でも定義すれば十分。ていうか、それすら不要です。
No.1
- 回答日時:
現在のおたくの
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()メソッドは定義できない
という意味であげた単なる例です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java java final 1 2022/06/10 22:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FileUtilsクラスを使ってフォル...
-
C言語での文字列より値を抜き出す
-
メソッドとコンストラクタ
-
abstract と static を一緒に付...
-
スーパークラスからサブクラス...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
意味の違いを教えてください Sh...
-
Javaプログラミングの参照とメ...
-
C#の継承関係。
-
オブジェクト参照がオブジェク...
-
コンストラクタで設定した値が...
-
エクセルVBA 画像を貼り付ける...
-
エクセルVBAの不思議な挙動?
-
3年間同じクラスになる確率
-
プロジェクトの参照設定の一覧...
-
保育士ですが、他クラスの担任...
-
newは明示的にした方が良いのか?
-
ExcelVBAのプログラムをJavaへ変換
-
VC++でMFCアプリ作成中です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
String.containsの反対機能はあ...
-
Java初級 引数に適用できません
-
abstract と static を一緒に付...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
レコード件数の表示
-
C言語での文字列より値を抜き出す
-
StringBufferからStringへキャ...
-
Java初心者です、エラーの意味...
-
Google Apps Script で getRang...
-
別クラスのmainメソッドの実行
-
Strutsでチェックボックスの値...
-
説明文書でのメソッド・変数の...
-
メソッド宣言の戻り値の型にク...
-
return new使用時
-
java ジェネリックスに関して
-
クラスを作るとメソッドの数が...
-
C# でメソッドに送られてきたOb...
-
メソッドの引数に指定されてい...
-
readLine()ではじめから読み直...
おすすめ情報