JFrameは、ウィンドウアプリの大元(フレーム)。
コンポーネント(ウィンドウの部品)は、このフレームに貼り付けていく。
HteFrame.java:(実験用のフレーム)
public class HteFrame extends JFrame {
public static void main(String[] args) {
HteFrame me = new HteFrame();
me.init();
me.setVisible(true);
}
private void init() {
setTitle("Swingの実験"); // ウィンドウのタイトル
initBounds(); // ウィンドウの位置の初期化
initLookFeel(); // ウィンドウの外観の初期化
initCloseOperation(); // 終了方法の初期化
initMenuBar(); // メニューバーの初期化
Container c = getContentPane();
initToolBar(c); // ツールバーの初期化
initPane(c); // ペインの初期化
initStatusBar(c); // ステータスバーの初期化
setResizable(true); // ウィンドウサイズを可変にする[2009-02-28]
// (デフォルトはtrue)
}
〜
}
ちなみに初期化について。
コンストラクターを自分で実装してその中に初期化処理(上記のinit()でやっているような事)を書いているサンプルがある
みたいだけど、単純なものならともかく、ドキュメントの内容に関わる部分まで含めるのはやめた方がいいと思う。
コンストラクターの処理が終わるまでJavaVMとしてのインスタンスの初期化が完了しないので、あまり複雑なことはさせない方が無難。特に初期値指定つきのメンバー変数の定義では
初期化の順序ってものがあるので、それを意識しないといけないようなコーディングになるのは危険。
ウィンドウの座標はsetLocation()、サイズはsetSize()で指定する。
両方同時に設定するsetBounds()というメソッドも有る。
import java.awt.Dimension; import java.awt.Toolkit;
/** * 画面の中央にウィンドウを表示 */ private void initBounds() { Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); //画面全体のサイズ int nx = d.width / 2; int ny = d.height / 2; int x = (d.width - nx) / 2; int y = (d.height - ny) / 2; setLocation(x, y); setSize(nx, ny); // 同じ→setBounds(x, y, nx, ny); }
中央に表示するにはWindow#setLocationRelativeTo()が使える。これを使うと自分で座標を計算する必要がない。[2009-02-28]
int nx = 256; int ny = 212; setSize(nx, ny); setLocationRelativeTo(null);
たくさんのウィンドウを開く場合、例えばWindowsではデスクトップの左上から順番にちょっとずつ右下にずれて表示される。[2009-04-19]
JDK1.5以降の場合、Window#setLocationByPlatform()を使うと、それを実現してくれる。
int nx = 256; int ny = 212; setSize(nx, ny); setLocationByPlatform(true);
ウィンドウサイズを(表示しているコンポーネントに応じて)最適な(最小な)サイズにするにはWindow#pack()が使える。[2009-04-05]
(これを使う場合でも、コンテナに先にコンポーネントが登録されている必要は無い模様)
pack(); setLocationRelativeTo(null);
JavaはOSによらず動くのが売りなので、Swingも、どのOSでも同じ外観をしているらしい。
が、変えることが出来る。使い慣れた“OS固有の外見”をしている方が使いやすいし。
/** * 外観をOSのものに似せる * <p> * (WindowsならWindowsの外観に似る) * </p> */ private void initLookFeel() { try { String look = // "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; UIManager.getSystemLookAndFeelClassName(); UIManager.setLookAndFeel(look); } catch (Exception e) { // 駄目なときは諦める e.printStackTrace(); } }
ウィンドウの×ボタンをクリックするとウィンドウは消えるが、デフォルト動作では、アプリケーション自体は終了しない。
(ウィンドウが見えなくなるだけ。javaのタスク(プロセス)自体は残り続けるので、とんでもないことに(苦笑))
単純に「×ボタンが押されたときにアプリを終了させる」には、以下のようにする。
/** * ウィンドウ終了時の動作を初期化 */ private void initCloseOperation() { // ウィンドウが閉じる時はプログラムの終了 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
その他、ウィンドウのリスナーを登録して、閉じるときにメソッドが呼ばれるようにすることも出来る。
/**
* ウィンドウ終了時の動作を初期化
*/
private void initCloseOperation() {
addWindowListener(new WindowAdapter() {
// ウィンドウが閉じるときに呼ばれる
public void windowClosing(WindowEvent e) {
System.out.println("Window Close!");
System.exit(0); //何かの後始末をしたい場合はSystem.exit()は使うべきでない
}
});
}
自分のフレーム自身にWindowListenerインターフェースをimplementsして「addWindowListener(this);」してもいいけど、メソッドがそこそこ有るみたいだから コーディングは面倒だろうね〜。
System.exit()を使わずに終了させる為には、setDefaultCloseOperation()と併せて指定しておけばよいようだ。[2009-09-26]
/** * ウィンドウ終了時の動作を初期化 */ private void initCloseOperation() { // ウィンドウが閉じる時はプログラムの終了 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addWindowListener(new WindowAdapter() { // ウィンドウが閉じるときに呼ばれる @Override public void windowClosing(WindowEvent e) { System.out.println("Window Close!"); } }); }