javaのGUIでは、Swingと呼ばれるクラス群があり、それを紹介します。
SwingにはJの名前から始まるたくさんの部品が存在します。
JFrameクラスは、フレーム付きのアプリケーションを作る時によく使われる基本クラスです。
この中にアプリケーションウインドウとして必要となる基本的なメソッドがたくさん用意されています。
次のプログラムで、JFrameクラスでどんな操作ができるか確認できます。
詳細は次のリンクで調べましょう。
package test; import javax.swing.JFrame; public class TestFrm00 { public static void main(String[] args) { JFrame frm1 = new JFrame();//生成 frm1.setTitle("TestFrm00-1");//タイトルバーの変更 frm1.setBounds(0, 0, 200, 150);//位置(0,0)と幅、高さを変更 frm1.setVisible(true);//表示 JFrame frm2 = new JFrame();//生成 frm2.setTitle("TestFrm00-2");//タイトルバーの変更 frm2.setBounds(100, 100, 200, 150);//位置(100,100)と幅、高さを変更 frm2.setVisible(true);//表示 } }
プログラムから分かるように、testのパッケージを使います。
その中にTestFrm00.javaを作成して、実行します。
カレントディレクトリから、このクラスをコンパイルする場合は、次のように指定します。
D:\java>javac test\TestFrm00.java
そして、実行する場合は、パッケージ名に
ドットを付けてクラス名を指定します。
D:\java>java test.TestFrm00
実行で次のようにウインドウが2つ表示されます。
この実行で気が付いたでしょうか?
閉じるボタンをクリックしても
コマンドプロンプトでプロンプトがでません。
つまりプログラムが終わっていないのです。
Windowのプログラムでは、mainが終わってもプログラムが終了しません。
( Javaのプログラム実行流れはスレッドと呼ばれる種類のものです。
全てのスレッドが終わるまではプログラムの終了となりません。
フレームの処理などは、mainのスレッドと異なるスレッドで行われるため
プログラム実行の流れがmainの閉じる } に達しても、
mainと異なるスレッドが終了していないので、
プログラムが終わっていないのです。)
本来は正しくプログラムを終了するプログラムを書く必要があるのですが、JFrame単体では出来ないので、プログラムを終了させる時にはCtrl+C のキー操作で強制終了ください。
正しく終了できるように修正したプログラムを次に示します。 それにはJFrameの継承クラスを作ります。
package test;
import javax.swing.JFrame;
public class TestFrm01 extends JFrame {
public TestFrm01() {
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setTitle("TestFrm01");
this.setBounds(0, 0, 200, 150);
this.setVisible(true);
}
}
JFrame.DISPOSE_ON_CLOSEの指定で、
クローズボタンをクリックすると、Frameの管理領域が破棄されます。
これにより、Frameのスレッドが終了することになります。
そして、全ての生成フレームを閉じることで、プログラムが終了できるようになります。(プロンプトが戻ります)
この指定を行うsetDefaultCloseOperationメソッドは、
JFrameのprotectedメソッドで、JFrameを継承させたくラスでないと操作できません。
よってJFrameの継承クラスを作らなくてはならないわけです。
なお、クロースボタンクリックの振る舞い指定は、
DISPOSE_ON_CLOSE設定値以外で、次のようなものがあります。
HIDE_ON_CLOSE (デフォルト値)、EXIT_ON_CLOSE、DO_NOTHING_ON_CLOSE
なお、上記TestFrm01を実行させるクラスの例を以下に示します。
import test.TestFrm01; public class Test//テスト用 { public static void main(String[] args){ new TestFrm01(); TestFrm01 frm2 = new TestFrm01(); frm2.setTitle("TestFrm01-2"); frm2.setBounds(100, 100, 200, 150); } }
なお、上記のmainメソッドを、次のようにTestFrm01のメソッドとすることにより(コピーする)、 TestFrm01クラス単体で、実行できるようになります。
package test; import javax.swing.JFrame; public class TestFrm01 extends JFrame { public TestFrm01() { this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setTitle("TestFrm01"); this.setBounds(0, 0, 200, 150); this.setVisible(true); } public static void main(String[] args) { new TestFrm01(); TestFrm01 frm2 = new TestFrm01(); frm2.setTitle("TestFrm01-2"); frm2.setBounds(100, 100, 200, 150); } }
フレームが持つ、ドラックによる移動、サイズ変更操作、最小化、最大化、閉じるボタンの機能などを確認ください。 これらの機能をカプセル化したものがJFrmaeクラスという訳です。