- PR -

匿名クラスの使ったWindow閉じる方法について

1
投稿者投稿内容
Javaスターター
ベテラン
会議室デビュー日: 2004/06/14
投稿数: 67
投稿日時: 2004-07-04 21:46
はじめまして。
今Awtを使ってWindowを閉じる方法を勉強していると
匿名クラスという言葉が出てきました。
そこで、実際に匿名クラスを使って試したところ、
下記ソースの★印のwindowClosingの部分をwindowsClosing
というふうにsをつけてしまったところ、
×印をクリックしてもWindowが閉じなくなってしまいました。
Javaから提供されているクラスのメソッドでもないのに、
どうしてsをつけてしまったところで、Windowの制御ができな
くなってしまうのでしょうか?
ちんぷんかんぷんな質問かもしれませんが、よろしくお願いいたします。

-----以下、ソース------
package gui_test;

import java.awt.*;
import java.awt.event.*;

class Figure7 extends Frame implements ActionListener{
public Figure7( String name ) { //コンストラクタ
setTitle ( name );
addWindowListener ( new WindowAdapter () {
public void ★windowClosing (WindowEvent we) {
System.exit(0);
}
});
setLocation ( 300, 200 );
setSize ( 300, 200 );
setBackground( Color.CYAN );
setLayout( new FlowLayout () );
}
public void actionPerformed ( ActionEvent ae ) {
if ( getBackground() == Color.CYAN ) {
setBackground( Color.MAGENTA );
}
else {
setBackground( Color.CYAN );
}
}
}

public class AwtSample7 {
public static void main(String[] args) {
Figure7 figure = new Figure7 ("Frame7");
Button btn1 = new Button ( "Change Color!" );
figure.add ( btn1 );
btn1.addActionListener ( figure );
figure.show();
}
}

ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2004-07-04 22:22
Frameクラスはデフォルトではウィンドウを閉じる操作([X]ボタンが押されたとき等)を受けても何もしません(ウィンドウが消えない)。
addWindowListenerメソッドで、ウィンドウを閉じる操作を受けたときにプログラムを終了するよう振る舞いが実装された匿名クラスのインスタンスが指定されているので、ウィンドウが閉じる操作でプログラムが終了しているのです。
WindowAdapterクラスのwindowClosingメソッドは何も処理をしない空メソッドなので、これを匿名クラス定義時にオーバーライドしないと、ウィンドウを閉じる操作を受けても何もしません。余分なsを付け、windowsClosingメソッドとしてしまった結果、windowClosingメソッドはオーバーライドされず、デフォルトの何も処理をしない空メソッドとなってしまったのです。この種のミスはAbstractクラスを使うときによく発生しがちです。
Javaスターター
ベテラン
会議室デビュー日: 2004/06/14
投稿数: 67
投稿日時: 2004-07-04 23:10
ToGoさんありがとうございました。
WindowClosingは空メソッドだったんですね。
あと、sをつけただけでは、独自に作成したメソッドと扱われて
コインパイル時にエラーにならないのですね。
貴重なコメントありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)