• ベストアンサー

フレームの×ボタンを押しても閉じることが出来ない

JAVAアプレットでプログラムを作成していまして、FileInputStreamで 取り込んだデータをフレームに表示させたんですが、表示させたフレーム のボタン(ウィンドウ右上の×ボタンなど)何を押しても終了できないんです。 それで色んな所で探していて、フレームを閉じる処理が見つかったので、 それを追加してみましたが、それもだめです。 これはどのようにすればよろしいのでしょうか? 下記にソースを記述しておきますので、悪い点がございましたら教えてください。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.io.*; import java.lang.*; class frame extends Frame implements WindowListener { Color bgcolor; Font font; Label lab_1,lab_2; frame() { super("title"); setLayout(null); bgcolor = new Color(240,248,255); setBackground(bgcolor); setForeground(Color.black); addWindowListener(this); font = new Font("Serif",Font.PLAIN,13); /* Labelを作成 */ lab_1 = new Label(); lab_2 = new Label(); lab_1.setFont(font); lab_1.setText("TEST1"); lab_1.setBounds(20,20,60,30); add (lab_1); lab_2.setFont(font); lab_2.setText("TEST2"); lab_2.setBounds(80,20,60,30); add (lab_2); } protected void processWindowEvent(WindowEvent endEvent) { System.exit(0); } }

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

  • ベストアンサー
noname#2875
noname#2875
回答No.3

とりあえず、コンパイルエラーが出ませんか? インターフェイスをimplementsしてあるので、 インターフェイスのなかで定義されているメソッドはすべて定義しなくてはなりません。 具体的には下記のものです。 void windowActivated(WindowEvent e) ウィンドウがユーザのアクティブウィンドウに設定されたときに呼び出されます。 void windowClosed(WindowEvent e) ウィンドウに対する dispose の呼び出しの結果として、ウィンドウがクローズされたときに呼び出されます。 void windowClosing(WindowEvent e) ユーザが、ウィンドウのシステムメニューでウィンドウを閉じようとしたときに呼び出されます。 void windowDeactivated(WindowEvent e) ウィンドウがユーザのアクティブウィンドウではなくなったときに呼び出されます。 void windowDeiconified(WindowEvent e) ウィンドウが最小化された状態から通常の状態に変更されたときに呼び出されます。 void windowIconified(WindowEvent e) ウィンドウが通常の状態から最小化された状態に変更されたときに呼び出されます。 void windowOpened(WindowEvent e) ウィンドウが最初に可視になったときに呼び出されます。 最低「これらのメソッドがない」というメッセージがでるはずです。 ~~は abstract として宣言する必要があります。~~を ~~で定義しません。 というエラーがそれです。 implements WindowListener やめて、 addWindowListener(this); を書き換えて、 protected void processWindowEvent(WindowEvent endEvent) { System.exit(0); } を消して、下記のようにすると閉じられます。 import java.awt.*; public class TestgFrame extends Frame {  public TestFrame()  {  setTitle("ふれーむのタイトルだよーん");  //以下略  TestWindowAdapter testWindowAdapter = new TestWindowAdapter();  this.addWindowListener(testWindowAdapter);  }  class TestWindowAdapter extends java.awt.event.WindowAdapter  {  public void windowClosing(java.awt.event.WindowEvent event)   {    event.getWindow().setVisible(false);//イベントのあったフレーム閉じる    event.getWindow().dispose();//イベントのあったフレーム破棄    //System.exit(0); アプレットなのでだめ   }  } } なお、アプレットという話ですので、System.exit(0); にしないほうがよいでしょう。 また、コンストラクタの名前はクラス名と同じにします。 さらにクラス名は大文字で始まるのが規則です。 (上の例ではなおしておきました) あと、失礼ですが、 フレーム閉じるのにMouseListenerは必要ないですよ…。 老婆心。 これらはすべて入門書にかいてありますので、 一冊本を読むことをお勧めします。

sr20detk
質問者

お礼

御礼が遅くなりましてすいません。 ご丁寧に教えていただいたおかげでうまく行きました。 私も本を読んで何とかがんばっているのですが、もともとCの知識も ない上、本を見てもなかなか理解できず本当に苦労しています。 本当に助かりました。どうもありがとうございました。

その他の回答 (2)

  • ct27
  • ベストアンサー率62% (48/77)
回答No.2

エラーの原因はimplementsしているインターフェースのせいだと思います。 私が先にのせましたサンプルソースではimplements MouseListenerとなっていますが、 sr20detkさんのほうではimplements WindowListenerになっています。 WindowListenerをimplementsしているのにMouseListenerのメソッドが書いて あったりするとエラーが出ると思います。 前回のソースはMouseListenerだったのですが、WindowListenerでよいのですか? (なかなか上手く説明できなくてすみません・・・)

  • ct27
  • ベストアンサー率62% (48/77)
回答No.1

まず最初にprocessWindowEventはJFrame(swing)のメソッドなのでFrameでは 使用できません。(swingについてわからない場合は調べてみて下さいね。) なのでイベントを利用します。windowClosingはユーザが、ウィンドウのシステムメニューで ウィンドウを閉じようとしたときに呼び出されます。 とりあえず私はこんな風にしてみました。 class labelFrame extends Frame implements MouseListener { Label label; labelFrame(String title) { super(title); setLayout(new FlowLayout()); label = new Label("Hello from Java! This is a frame window."); add(label); addMouseListener(this); //↓ここから↓ this.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(WindowEvent e) { doWindowClose(); } }); //↑ここまで↑ } ********(中略)********* //↓メソッド↓ void doWindowClose(){ this.setVisible(false); } //↑メソッド↑ this.setVisible(false);の部分は閉じるのではなく非表示にする意味ですが 前回のソースを見ると切替をsetVisibleでやっていたのでこれにしてみました。

sr20detk
質問者

補足

*********************************************************** frame.java:7: frame は abstract として宣言する必要があります。mouseClicked(jav a.awt.event.MouseEvent) を frame で定義しません。 class frame extends Frame implements MouseListener *********************************************************** コンパイル時に上記エラーが出たのですが、内容が理解できず 対処に困っています。 教えていただいた、ソースを記述すると共に、修正しました。中略以外は (クラス名称の違いを除く)全て同じようなプログラムにはなっています。 他に何かいけない所があるのでしょうか?

関連するQ&A