- PR -

Windowクロース時に処理をさせるには

1
投稿者投稿内容
navyblue
会議室デビュー日: 2007/06/17
投稿数: 2
投稿日時: 2007-06-17 21:03
大変初歩的な質問で申し訳ないのですが、EclipseのVisual Editorを用いて
プログラム終了時の処理を組み込もうと思っています(具体的には
Windowのcloseボタンを押したときにそのときの各変数値をファイルに書き込む。

しかし、下記のとおり、Window終了時のプロセスに処理を書くと、
非static変数(aaa)をstatic内で参照できない、と起こられてしまいます。
mainがstaticメソッドなので当たり前だとは思うのですが、このようなときはどのように
回避すればよいのでしょうか。物の本によると、saticメソッド内で非staticメンバーなどを
使うときはそのクラスをnewでインスタンス化して実態を作ればいい、とありましたが、
それでもうまく行きませんでした。

ご存知の方教えてください。
以下問題になったプログラムの例を載せます。



import java.awt.BorderLayout;
import java.io.BufferedWriter;
import java.io.FileWriter;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ForIT extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
String aaa="aaa";  /* String aaaを宣言 */
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ForIT thisClass = new ForIT();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
FileWriter rt = new FileWriter("C:\\\\a.txt");
BufferedWriter br = new BufferedWriter(rt);
/* String aaaの内容をファイルに書き出したいが、非staticであるとしてエラー */
br.write(aaa); }
});
}
public ForIT() {
super();
initialize();
}
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
}
return jContentPane;
}

}



[ メッセージ編集済み 編集者: navyblue 編集日時 2007-06-19 22:58 ]
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2007-06-17 22:09
誤りは2点です。

1点目は、navyblueさんが認識しているとおりで、
インスタンス変数aaaは、staticメソッドおよびその中で定義された無名クラスからアクセスできない、という点。

それともう1点あって、それは、JFrame#setVisible(boolean)の後に書いた処理は
  「Window終了時の処理にならない」
という点です。
ファイルの出力処理の代わりに
System.out.println("hoge")
とかしてみると分かると思いますが、ウィンドウが表示されると同時にコンソールにhogeと表示されます。

で、答えですが、
java.awt.Window#addWindowListener(java.awt.event.WindowEvent)
を使いましょう。登録するリスナのwindowClosingかwindowClosedメソッドに書けば、望みどおりの結果が得られます。
EclipseのVisual Editorを使っているのなら、JFrameオブジェクトを右クリックして、ポップアップメニューから
「Events」>「windowClosing」
を選ぶと空のメソッドができますので、そこに書けばいいでしょう。
navyblue
会議室デビュー日: 2007/06/17
投稿数: 2
投稿日時: 2007-06-18 22:14
koe様

ありがとうございました。うまく行きました。
また、Eclipseに便利な機能もあるんですね。あまり頼りすぎるのも良くないですが、
まずはjavaに慣れるための約束事を覚えるのに活用したいです。

いずれにしても、初歩的な質問に丁寧にご回答いただきありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)