-PR-
解決済み

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

  • 困ってます
  • 質問No.49651
  • 閲覧数399
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 70% (22/31)

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);
}
}
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答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

お礼率 70% (22/31)

御礼が遅くなりましてすいません。
ご丁寧に教えていただいたおかげでうまく行きました。

私も本を読んで何とかがんばっているのですが、もともとCの知識も
ない上、本を見てもなかなか理解できず本当に苦労しています。

本当に助かりました。どうもありがとうございました。
投稿日時 - 2001-03-10 16:32:16
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.2
レベル9

ベストアンサー率 62% (48/77)

エラーの原因はimplementsしているインターフェースのせいだと思います。
私が先にのせましたサンプルソースではimplements MouseListenerとなっていますが、
sr20detkさんのほうではimplements WindowListenerになっています。
WindowListenerをimplementsしているのにMouseListenerのメソッドが書いて
あったりするとエラーが出ると思います。

前回のソースはMouseListenerだったのですが、WindowListenerでよいのですか?
(なかなか上手く説明できなくてすみません・・・)


  • 回答No.1
レベル9

ベストアンサー率 62% (48/77)

まず最初に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

お礼率 70% (22/31)

***********************************************************
frame.java:7: frame は abstract として宣言する必要があります。mouseClicked(jav
a.awt.event.MouseEvent) を frame で定義しません。
class frame extends Frame implements MouseListener
***********************************************************

コンパイル時に上記エラーが出たのですが、内容が理解できず
対処に困っています。
教えていただいた、ソースを記述すると共に、修正しました。中略以外は
(クラス名称の違いを除く)全て同じようなプログラムにはなっています。
他に何かいけない所があるのでしょうか?
投稿日時 - 2001-03-09 18:03:38
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ