AWTでウィンドウを閉じる仕組み

このQ&Aのポイント
  • AWTを使用してウィンドウを閉じる処理について説明します。
  • WindowCloseクラスはWindowAdapterクラスを継承し、windowClosingメソッドをオーバーライドしています。
  • FigureクラスのインスタンスにWindowCloseのインスタンスを登録することで、ウィンドウを閉じる動作を実現しています。
回答を見る
  • ベストアンサー

AWTでウィンドウを閉じる仕組み

import java.awt.*; import java.awt.event.*; class WindowClose extends WindowAdapter{ public void windowClosing(WindowEvent we){ System.exit(0); } } class Figure extends Frame{ public Figure(String name){ setTitle(name); setLocation(300,200); setSize(300,200); setBackground(Color.ORANGE); WindowClose wc = new WindowClose(); addWindowListener(wc); } } public class Test{ public static void main(String [] args){ Figure figure = new Figure("Frame1"); figure.show(); } } 初歩的なことな質問で申し訳ないです。 このような処理でウィンドウを閉じているのですが、具体的に何を取得してどんな動作をしているのかがよくわかりません。 wcというインスタンスにウィンドウリスナーのオブジェクトが追加登録されるという感じだと思いますが、extends されているWindowAdapterクラスにはすでにウィンドウリスナーのインスタンスが実装されていますよね。一体何の意味があるのでしょうか。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#161640
noname#161640
回答No.1

疑問点は、「WindowListenerがあるのに、なぜそれをextendsしたWindowAdapterがあるのか、なんの意味があるのか」ということでしょうか。これは、一言で言えば、WindowListenrを使うのは「面倒くさい」からです。 WindowListenerには全文で7つのメソッドが用意されています。ということは、これをimplementsしたクラスでは、常に7つのメソッドを実装しなければいけません。ウインドウを閉じるのにwindowClosingしか使わないとしても、残る6つのメソッドも必ず書かないといけません。これ、面倒臭くないですか? それで、あらかじめimplements済みのクラスWindowAdapterを用意しておいたわけです。これをextendsすれば、必要なメソッドだけオーバーライドすれば済みます。いちいち全部のメソッドを書く必要はありません。とても楽です。そこで、2つの上のメソッドがあるインターフェイスには、それを実装済みのアダプタクラスが用意されているのです。

JoyWorld
質問者

お礼

よくわかりました。 ありがとうございます

関連するQ&A

  • java初心者です

    空のウィンドウを作ってみたものの ウィンドウが閉じれません。ファイル名はMyApp3.javaです。クラスファイルは3つちゃんとできてます import java.awt.*; import java.awt.event.*; class MyFrame extends Frame { public MyFrame(){ addWindowListener(new MyWindowAdapter()); } class MyWindowAdapter extends WindowAdapter { public void WindowClosing(WindowEvent e){ System.exit(0); } } } public class MyApp3 { public static void main(String[] args){ MyFrame f =new MyFrame(); f.setSize(300,200); f.setVisible(true); } }

    • ベストアンサー
    • Java
  • 自作ウィンドウを閉じる方法について

    只今、これならわかるJAVAという書籍でウィンドウを生成し、×ボタンがクリックされたら、ウィンドウを閉じる(プログラムを終了する)ようなプログラムを作っているのですが、書籍通りに記述しているのですが、×ボタンをクリックしてもウィンドウが閉じません。ソースは、 import java.awt.*; import java.awt.event.*; //ウィンドウを表すクラスFrameを継承し、自作のウィンドウを表すクラスを作成する public class EventDispose extends Frame{ public EventDispose() { addWindowListener(new MyWindowAdapter()); } class MyWindowAdapter extends WindowAdapter{ public void WindowClosing(WindowEvent e) { System.exit(0); } } } です、。表示を行っているクラスが、 public class MyWinApp { public static void main(String[] args) { //自作のウィンドウの生成(コンストラクタの実行) EventDispose ed = new EventDispose(); //ウィンドウのサイズの指定 ed.setSize(300,200); //生成したウィンドウを可視状態にする ed.setVisible(true); } } です。開発環境はeclipseの3.4です。 どうかご教授よろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaのエラーなのですが

    import java.awt.*; import java.awt.event.*; class PrefFrame extends Frame { public PrefFrame(String title) { //フレームのタイトル setTitle(title); //ウィンドウを閉じる時 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } public class PrefTest { public static void main(String args[]) { PrefFrame frm = new PrefFrame("都道府県マスター"); frm.setLocation(300, 200); frm.setSize(250, 350); frm.setBackground(Color.LIGHT_GRAY); frm.setVisible(true); } } と入力しました。コンパイルは出来て、CLASSファイルは作成できたのですが、実行できずにエラーException in thread "main" java.lang.NoClassDefFoundError: PrefTest/javaとなってしまいます。実行するためにはどうしたらよいのでしょうか?

  • これを正確に実行したいのですが

    再びすみません。 下のプログラムなのですが。コンパイルはできるのに 図が表示されず、終わらず、実行がおかしなことになってしまいます。どこを直したらいいのでしょうか? お願い致します。 import java.awt import java.awt.event.*; class gazou extends Frame { public gazou(){ setSize(300,200); addWindowListener(new WindowAdapter( ) public void windowClosing(WindowEvent e) System.exit(0); } }); } public void paint(Graphics g) g.drawRect(40,40,50,50); g.drawRoundRect(100,40,50,50,10,10); g.drawOval(160,40,50,50); g.drawArc(220,40,50,50,45,270); g.fillRect(40,100,50,50); g.fillRoundRect(100,100,50,50,10,10); g.fillOval(160,100,50,50); g.fillArc(220,100,50,50,45,270); g.drawLine(40,180,260,180); } } public class kadai19{ public static void main(String[] args) { Frame w = new Frame(); w.show( ); } }

    • ベストアンサー
    • Java
  • フレームを表示できないのですが・・・

    こんにちは。ジャバ初心者です。下記のプログラムを javac Sample120.java と入力してコンパイルはできたのですが java Sample120 と入力すると Exception in thread "main" java.lang.NoClassDefFoundError: Sample120 というメッセージが出て実行できないのですがどのようにすればいいですか? import java.awt.*; import java.awt.event.*; class Sample120 extends Frame { public static void main(String args[]) { Sample120 app = new Sample120(); } public Sample120() { setSize(250,100); setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void paint(Graphics g) { g.drawString("Hello Java AWT!",10,60); } }

    • ベストアンサー
    • Java
  • 簡単なこーどですが、エラーの原因が分かりません

    今晩は、JAVAの初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「j.show();」では警告が出ています。 何が原因でしょう?? ============================================================ import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; class JFrame_Ohayou extends JFrame implements WindowListener{ /*********** コンストラクタ ********************/ public JFrame_Ohayou(){ setSize(400,300); setTitle("JFrameのテスト"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } /******************* paint ***********************/ public void paint(Graphics g){ super.paint(g); g.drawString("おはよう",20,40); } } /******************* main ***********************/ public class JFrameTest{ public static void main(String[] args){ JFrame_Ohayou j = new JFrame_Ohayou(); j.show(); } } =============================================================

    • ベストアンサー
    • Java
  • Javaプログラムの繋げ方について。

    Javaプログラムの繋げ方について。 今まで(1)のようなプログラムを書いていました。 作りたいものに向けて色々検索するとやりたいものに近い(2)のようなサンプルプログラムを見つけました。 しかし、Java初心者なもので混ぜ方(?)がわかりません。 現在の私の知識からいうと今までのはアプレットでフレーム使うのはアプリケーションなのかな?別物なのかな?そんな感じです。 もし、混ぜることができるなら何かアドバイスをお願いします。 (1)package test; import java.applet.* ; import java.awt.Label ; import java.awt.Font ; import static java.awt.Font.BOLD ; import java.util.*; import java.awt.Graphics; import java.awt.Image; import java.awt.*; public class test extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); g.fillOval(320, 200, 100, 100); } public void init () { ~~~~~~~~~~~~~~~~ } public void start () { ------------ }}} (2)import java.awt.*; import java.awt.event.*; public class MouseEvent7 extends Frame { int posX = 50; int posY = 50; public static void main(String [] args){ new MouseEvent7(); } //コンストラクタ MouseEvent7(){ this.addWindowListener(new WinAdapter()); //ウィンドウリスナーの登録 this.setSize(200,200); this.setVisible(true); //MouseMotionListenerの登録 addMouseMotionListener( new MouseMotionAdapter(){ public void mouseMoved(MouseEvent e){ posX = e.getX(); posY = e.getY(); repaint(); //paintメソッドを実行 } } ); } public void paint(Graphics g){ g.drawOval(posX,posY,50,50); } } (1)の内容に本当に(2)のプログラムで出来るマウスの動きに合わせて円も動く+クリックしたらそこで止まるだけいいのですが。 出来たら止まった点の座標も取りたいですが、そこまではいってません;;

  • java アプレットでエラー

    以下のサンプルソースをEclipse上で実行したら "アプレットは初期化されていません"というエラーになってしまいました。 //フレームウィンドウの表示/非表示を切り替える。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Sample129 extends Applet implements ActionListener { Button bt; frame fr; public void init() { bt = new Button("ウィンドウ表示"); add(bt); bt.addActionListener(this); fr = new frame("操作対象ウィンドウ"); fr.setSize(250,120); } public void actionPerformed(ActionEvent event) { //ウインドウを表示 fr.setVisible(true); } } class frame extends Frame { frame(String title) { super(title); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //ウインドウを非表示 setVisible(false); } }); } public void paint(Graphics g) { g.drawString("閉じるボタンで非表示",65,65); } } ■エラー内容 java.lang.NoSuchMethodError: frame: method <init>(Ljava/lang/String;)V not found at Sample129.init(Sample129.java:17) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) どうすればこのエラーが解消できるのでしょうか。

  • Label を リスナーと結びつける方法

    フレーム上に (ボタンやリストやチェックボックスではなくて) ラベルを用いて、ラベルを押すことにより 背景が変わるプログラムを作りたいのですが どのようにイベント処理すれば、うまくいくのでしょうか。 プログラムは以下のように作りましたがイベントリスナを どのように加えればいいのかがわかりません>< よろしくお願いしますm(_ _)m import java.awt.*; import java.awt.event.*; public class Test{ public static void main(String args[]){ MyFrame f=new MyFrame("Test"); f.setVisible(true); } } class MyFrame extends Frame{ Label red, green, blue; MyFrame(String s){ super(s); setSize(200,200); setLocation(100,150); setLayout(new FlowLayout(FlowLayout.CENTER)); add(red=new Label("■")); red.setForeground(Color.red); add(green=new Label("■")); green.setForeground(Color.green); add(blue=new Label("■")); blue.setForeground(Color.blue); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } }

    • ベストアンサー
    • Java
  • Frameクラスにアクセスできない??

    初心者なのですが、下記のソースをコンパイルすると、下のエラーが表示されます。 CLASSPATHがおかしいんでしょうか? バージョンはJ2SE1.5.0_03です。 C>javac app.java コンパイルエラー内容: .\Frame.java:4: クラス AppFrame が重複しています。 class AppFrame extends Frame{ ^ app.java:4: Frame にアクセスできません。 クラスファイル .\Frame.java は不正です。 ファイルにクラス Frame が含まれていません。 削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。 class AppFrame extends Frame{ ^ エラー 2 個 サンプルコード mport java.awt.*; import java.awt.event.*; class AppFrame extends Frame{ public void paint(Graphics g){ g.drawString("Hello frame Java!",60,100); } } public class app{ public static void main(String[] args){ AppFrame f=new AppFrame(); f.setSize(200,200); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0);}}); f.show(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう