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);
}
}
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は必要ないですよ…。
老婆心。
これらはすべて入門書にかいてありますので、
一冊本を読むことをお勧めします。
御礼が遅くなりましてすいません。
ご丁寧に教えていただいたおかげでうまく行きました。
私も本を読んで何とかがんばっているのですが、もともとCの知識も
ない上、本を見てもなかなか理解できず本当に苦労しています。
本当に助かりました。どうもありがとうございました。
No.2
- 回答日時:
エラーの原因はimplementsしているインターフェースのせいだと思います。
私が先にのせましたサンプルソースではimplements MouseListenerとなっていますが、
sr20detkさんのほうではimplements WindowListenerになっています。
WindowListenerをimplementsしているのにMouseListenerのメソッドが書いて
あったりするとエラーが出ると思います。
前回のソースはMouseListenerだったのですが、WindowListenerでよいのですか?
(なかなか上手く説明できなくてすみません・・・)
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でやっていたのでこれにしてみました。
この回答への補足
***********************************************************
frame.java:7: frame は abstract として宣言する必要があります。mouseClicked(jav
a.awt.event.MouseEvent) を frame で定義しません。
class frame extends Frame implements MouseListener
***********************************************************
コンパイル時に上記エラーが出たのですが、内容が理解できず
対処に困っています。
教えていただいた、ソースを記述すると共に、修正しました。中略以外は
(クラス名称の違いを除く)全て同じようなプログラムにはなっています。
他に何かいけない所があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- オープンソース パイソン、Jupyter Labのインストールができない。 3 2023/04/05 21:57
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- HTML・CSS html cssのmargin 5 2022/12/03 11:04
- HTML・CSS HTMLソースの質問 3 2022/07/28 13:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<forEach> 内で供給された "ite...
-
eclipseに記述したjavaファイル...
-
ColabでのPytorchのエラー
-
Javaを使ってデジタル時計を作...
-
Selenium IDEでexportしたコー...
-
Javaで常駐するソフトを作って...
-
ActionForm form にnullが入っ...
-
setAttribute(String, int)は適...
-
jcpad
-
importとextendsの用い方の違い...
-
JOGLのインストール方法
-
「例外 *** は対応する try 文...
-
JavaでWindowsのタスクトレイに...
-
アプレットが初期化されていま...
-
【JAVAエラー】互換性のない型...
-
Javaを使用して定時送信をしたい
-
(急募/教えて)Java三択クイズを...
-
Javaからストアド実行(配列項目)
-
文字サイズが可変のラベル
-
【java】検索フォームの検索結...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「例外 *** は対応する try 文...
-
eclipseに記述したjavaファイル...
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
干支の計算で。。。
-
Javaを使ってデジタル時計を作...
-
HTMLでのTableタグデータ取得方法
-
importするには java.io.*; imp...
-
生年月日と今日の日付から年齢...
-
文字列を数式に
-
シャットダウンフックが呼ばれない
-
Javaで常駐するソフトを作って...
-
フレームの×ボタンを押しても閉...
-
Selenium IDEでexportしたコー...
-
文字サイズが可変のラベル
-
jFrameを使って複数の画面を生...
-
【java】検索フォームの検索結...
-
Java での グローバルIP取得
-
(急募)JavaカレンダーをGUI可に...
-
ファイル名を動的に生成したい
おすすめ情報