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);
}
}

このQ&Aに関連する最新のQ&A

A 回答 (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は必要ないですよ…。


老婆心。
これらはすべて入門書にかいてありますので、
一冊本を読むことをお勧めします。
    • good
    • 0
この回答へのお礼

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

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

本当に助かりました。どうもありがとうございました。

お礼日時:2001/03/10 16:32

エラーの原因はimplementsしているインターフェースのせいだと思います。


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

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

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

コンパイル時に上記エラーが出たのですが、内容が理解できず
対処に困っています。
教えていただいた、ソースを記述すると共に、修正しました。中略以外は
(クラス名称の違いを除く)全て同じようなプログラムにはなっています。
他に何かいけない所があるのでしょうか?

補足日時:2001/03/09 18:03
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJDialogの×(閉じる)ボタン

JDialogの右上に付いている×(閉じる)ボタンを
使用可能にしたり、使用不可能にしたいのですが、
setEnabled(false)やsetClosable(false)みたいな、
コマンドは無いのでしょうか?

または、×(閉じる)ボタンを出さない方法でも
よいので教えてください。

宜しくお願いします。

Aベストアンサー

javax.swing.JDialog#setDefaultCloseOperation()
を使います。

引数はjavax.swing.WindowConstantsの。。。

・HIDE_ON_CLOSE
・DISPOSE_ON_CLOSE
・DO_NOTHING_ON_CLOSE

のいずれかの定数を用います。
動作の違いはWindowConstantsのAPIをご覧下さい。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q生成したインスタンスを削除する方法

言語:JAVA

生成したインスタンスを削除するにはどのようにすれば良いでしょうか?

testData = new TestData();

testDataはセッション内に格納してあります。
また、testDataはNULLのままだったり、実際に値が入っていたりもします。

NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたいと考えています。
初歩的な質問ですみませんが、教えてください。

よろしくお願いいたします。

Aベストアンサー

浅学なため、TestDataというクラス名と「セッション内に格納」という表現だけからどうしてHttpSessionが出てくるのか分かりませんが...

Javaでは、明示的な操作(C++のdeleteのような)によってインスタンスを削除することはできません。そのインスタンスがどこからも参照されなくなったらGCで消えます。もう要らない(消えてほしい)インスタンスを参照している変数やフィールドにはnullを代入することで参照をなくします。

testData = null;

> NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたい

何がNULLだとどのように不都合なのかを説明してもらえると、別の回答がつくかもしれません。

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

Qダイアログにおける改行

JAVA で GUI プログラミングをしています.
今ダイアログを作っていて,ダイアログに表示させる
メッセージが長すぎるため,改行で区切って2段のメッセージにしたいのですがうまくいきません.
ダイアログのメッセージに改行を出力させる方法を
教えて下さい.お願いします.

私は以下のようなプログラムを作ってコンパイルできませんでした.

JOptionPane.showMessageDialog(frame,
"ここに改行を含むメッセージを" + \n + "入力します.","Help",JOptionPane.PLAIN_MESSAGE);

Aベストアンサー

メッセージを\n入力

メッセージを" + "\n" + "入力
でしょうか。

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。

Qあるコンボボックスを選択するともう一方のコンボボックスが自動的に決まる方法

二つのコンボボックスがあります。
1つのコンボボックスをcb1、もう一方のコンボボックスをcb2とします。cb1の中にはA、B、Cという項目があります。
質問の内容は、例えばcb1のAを選択するとcb2の項目が自動でa、b、cになっている、cb1のBを選択するとcb2の項目が自動でd、e、fになっている、ということなのです。
こんな感じに自動的に状態が変化することは可能なのでしょうか?宜しくお願いします。

Aベストアンサー

こんにちは、こんな感じの事を求めているのですか
コンボボックス1を選択すると、
コンボボックス2の項目が変わります。

/*
* twocombo.java
*
* Created on 2006/02/06, 10:46
*/

package combolist;

import javax.swing.DefaultComboBoxModel;

/**
*
* @author
*/
public class twocombo extends javax.swing.JFrame {
Object [] combo1 ={"a","b","c"};
Object [] combo2 ={"d","f","g","h"};
Object [] combo3 ={"i","j","k"};
Object [] combo4 ={"l","m","n","o"};

DefaultComboBoxModel com1,com2,com3,com4;

/** Creates new form twocombo */
public twocombo() {
com1= new DefaultComboBoxModel(combo1);
com2= new DefaultComboBoxModel(combo2);
com3= new DefaultComboBoxModel(combo3);
com4= new DefaultComboBoxModel(combo4);
initComponents();
jComboBox1.setModel(com1);
jComboBox2.setModel(com2);

}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" 生成されたコード">
private void initComponents() {
jComboBox1 = new javax.swing.JComboBox();
jComboBox2 = new javax.swing.JComboBox();

getContentPane().setLayout(null);

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jComboBox1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jComboBox1ActionPerformed(evt);
}
});

getContentPane().add(jComboBox1);
jComboBox1.setBounds(50, 60, 110, 21);

getContentPane().add(jComboBox2);
jComboBox2.setBounds(250, 60, 110, 21);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-408)/2, (screenSize.height-332)/2, 408, 332);
}
// </editor-fold>

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {

if (jComboBox1.getSelectedItem().equals(combo1[0])){
jComboBox2.setModel(com2);
}else if (jComboBox1.getSelectedItem().equals(combo1[1])){
jComboBox2.setModel(com3);
}else {
jComboBox2.setModel(com4);
}



// ここに処理コードを追加:
}

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new twocombo().setVisible(true);
}
});
}

// 変数宣言 - 編集不可
private javax.swing.JComboBox jComboBox1;
private javax.swing.JComboBox jComboBox2;
// 変数宣言の終わり

}

こんにちは、こんな感じの事を求めているのですか
コンボボックス1を選択すると、
コンボボックス2の項目が変わります。

/*
* twocombo.java
*
* Created on 2006/02/06, 10:46
*/

package combolist;

import javax.swing.DefaultComboBoxModel;

/**
*
* @author
*/
public class twocombo extends javax.swing.JFrame {
Object [] combo1 ={"a","b","c"};
Object [] combo2 ={"d","f","g","h"};
Object [] combo3 ={"i","j","k"};
Object [] combo4 ={"l","m","n","o"};
...続きを読む

Q画面を隠す・消す方法を教えてください。

初心者の質問ですが、
java swingで画面を2つ作り、メイン画面のボタンからサブ画面を
呼ぶというクラスを作りました。
サブ画面には「OK」ボタンと「CANCEL」ボタンがあり、
「CANCEL」ボタンを押すとサブ画面が隠れるか、消える仕様に
したいのですがどのように実装すればいいでしょうか?
よろしくお願いします。

Aベストアンサー

簡単に作ってみました。
こんな感じでしょうか?
※見やすくするために全角スペースを使用しているのでコピペしてもコンパイルできません。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

class Test implements ActionListener{
 JFrame f;
 JDialog dialog;
 JButton button, ok, cancel;

 Test(){
  // メイン画面を作成
  f = new JFrame("メイン画面");
  Container pane = f.getContentPane();

  // メイン画面のボタンを作成
  button = new JButton("サブ画面を作成");
  button.addActionListener(this);

  // ボタンを貼り付けるパネルを作成
  JPanel panel = new JPanel();

  // ボタンを貼り付ける
  panel.add(button);
  pane.add(panel);

  // 表示
  f.setBounds(0, 0, 200, 80);
  f.setVisible(true);
 }

 public static void main(String[] args){
  new Test();
 }

 public void actionPerformed(ActionEvent e){
  // メイン画面のボタンが押されたら、
  // サブ画面(ダイアログ)を開く
  if(e.getSource() == button){
   dialog = new JDialog(f, "サブ画面");
   Container pane = dialog.getContentPane();

   // OKボタンとCANCELボタンを作成
   ok = new JButton("OK");
   cancel = new JButton("CANCEL");

   ok.addActionListener(this);
   cancel.addActionListener(this);

   // ボタンを貼り付けるパネルを作成
   JPanel panel = new JPanel();

   // ボタンを貼り付ける
   panel.add(ok);
   panel.add(cancel);
   pane.add(panel);

   // 表示
   dialog.setBounds(30, 30, 200, 80);
   dialog.setVisible(true);
  }

  // サブ画面(ダイアログ)のCANCELボタンが押されたら
  // サブ画面(ダイアログ)を消す
  if(e.getSource() == cancel){
   dialog.hide();
  }
 }
}

簡単に作ってみました。
こんな感じでしょうか?
※見やすくするために全角スペースを使用しているのでコピペしてもコンパイルできません。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

class Test implements ActionListener{
 JFrame f;
 JDialog dialog;
 JButton button, ok, cancel;

 Test(){
  // メイン画面を作成
  f = new JFrame("メイン画面");
  Container pane = f.getContentPane();

  // メイン画面のボタンを作成
  button = new JB...続きを読む

Q描画処理が実行されない

while(gameflag==true){
(数値設定)   
repaint();
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+1000){
}
}

上記のようにwhileループの中で数値などの設定を行い、描画をし、遅延をしているのですが他の処理はちゃんと実行されるのになぜか描画処理だけが行われません。また、whileループ外でも描画を行っていますがその時点ではきちんと描画されます。描画されない原因はどのようなことが考えられるでしょうか?描画はpaintComponent(Graphics g) メソッドで描画しています。

Aベストアンサー

>描画されない原因はどのようなことが考えられるでしょうか?

Swingの描画はダブルバッファを使っている関係上、描画メソッドを呼び出したときではなく、その後、もっとも早く再描画できるタイミングで表示を更新します。このため、while内で描画を行っている場合には、そのwhileを抜け、処理が終了した頃で表示が更新されるため、while中で行っている描画処理は見えません。(途中の描画は見えず、最終的に描画された状態だけが表示される)

この処理は、別スレッドを使って実行していますか? メインスレッドでは、上のような理由で途中の更新は見えませんから、マルチスレッドで実行し、描画ごとに強制的にrepaintするなどしてみてはいかがでしょう。

QJScrollPane上のJTableの再描画

JPanel上で,以下の初期化関数を作って,データが更新されたときに,この初期化関数を再度呼び出して,テーブルを作り直しています.

描画直後は,正しく表示されるのですが,
スクロールバーに触ったり,セルをクリックしたりすると,
初めに作成したテーブルの表示に戻ってしまいます.

何が原因で,どのように対処すれば良いのでしょうか?
ご回答いただけますよう,よろしくお願いいたします.

public void init_table()
{
tablemodel1 = new DefaultTableModel(column_names1, text.keyword_num);
table1 = new JTable(tablemodel1);
scrollt1 = new JScrollPane(table1);
add(scrollt1);

    以下略
}

Aベストアンサー

何にadd()しとんのや?
レイアウトマネージャはちゃんとしとんのか?

ふつうSwingのコンテナなら、
古いコンポーネントを
remove()して
repaint()して
新しいコンポーネントを
add()して
revalidate()するのが基本的な手続きどすえ。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング