Windowsアプリケーションを作る一番一般的な方法は、VisualBasicを使う事でしょう。このページでは、VisualBasicで作ったようなGUIを持つアプリケーションを、Javaを使って作って行きます。
Java 2 Standard Edition v1.4 SDKを使用します。下記リンクを参照して、環境を構築してください。環境変数の設定をお忘れなく。
まず、Javaアプリケーションとしての最小コードを書いてみます。これは、なーんにもしないで終了するだけのアプリケーションです。
public class HelloWorld {
public static void main(String[] args) {
//
// 処理コードをここに追加する。
//
}
}
上のコードを"HelloWorld.java"というファイル名で保存し、コンパイルします。
javac HelloWorld.javaすると"HelloWorld.class"というファイルが出来るはずです。次にこれを実行します。
java HelloWorldなーんにもしないで、アプリケーションが終了します。味気ない…。
何にもしないアプリケーションでは無いほうがマシなので、ここではコマンドラインに「Hello World!」と表示させてみます。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
VBを使えば、ただ単にVBを起動しただけでアプリケーションが出来てしまいます。とりあえず、この(ノッペラボウで何もしないけれども立派な)アプリケーションを作ります。
JavaでGUIアプリケーションを作る場合には、Swingパッケージを使います。以前はAWTパッケージも使われていましたが、Swingの方がずっとリッチなGUIを簡単に使えます。このSwingには、3つのトップレベル コンテナがあります。
// パッケージのインポート。
import javax.swing.*;
public class HelloWorld {
public static void main(String[] args) {
// フレーム コンテナを作る。
JFrame jFrame1 = new JFrame("Hello World!");
//
// 処理コードをここに追加する。
//
// ユーザーがウィンドウの[×]を押した時のイベント処理。
jFrame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// フレームのサイズ調整
jFrame1.pack();
// 表示
jFrame1.setVisible(true);
}
}
実行してみると、ウィンドウのタイトルバーに「Hello World!」と書かれているのが判るでしょうか?GUI版最小のHelloWorldの出来上がりです。[×]ボタンを押して終了させると、コマンドラインに戻ってきます。
ここではウィンドウのクライアント領域にラベル コンポーネントを追加して、もうちょっとHelloWorldらしくしてみます。
import javax.swing.*;
public class HelloWorld {
public static void main(String[] args) {
JFrame jFrame1 = new JFrame("HelloWorld");
// ラベルコンポーネントを追加。
final JLabel jLabel1 = new JLabel("Hello World!");
jFrame1.getContentPane().add(jLabel1);
//
// 処理コードをここに追加する。
//
jFrame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame1.pack();
jFrame1.setVisible(true);
}
}
上のソースを、もう少し見通し良く書き直してみます。動作結果は全く同じです。
import javax.swing.*;
public class HelloWorld extends JFrame{
// コンストラクタ
public HelloWorld() {
initComponents();
}
// フォーム初期化処理
private void initComponents() {
jLabel1 = new JLabel();
setTitle("Hello World!");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel1.setText("Hello World!");
getContentPane().add(jLabel1);
pack();
}
// コマンドライン引数の処理
public static void main(String[] args) {
new HelloWorld().show();
}
// 変数宣言
private JLabel jLabel1;
}
HelloWorldアプリケーションに、メニューを付けてみます。メニューを付けると、メニューイベント処理が必要になります。今までのアプリケーションでも、ウインドウの最小化・最大化・アプリケーション終了のイベントが有りますが、みんなJavaにお任せでした。
「メニュー」と呼ばれる機能は、Swingでは3種類のコンポーネントが使われます。Windowsのメモ帳アプリケーションを例にすると、下記のとおりです。
| コンポーネント | メモ帳では |
|---|---|
| JMenuBar | メニューバー |
| JMenu | ファイル、編集、書式、ヘルプ |
| JMenuItem | 新規、開く、上書き保存、名前を付けて保存、ページ設定、印刷、メモ帳の終了、セパレータ |
ここではとりあえず見た目だけ、メニューを付けてみます。
import javax.swing.*;
public class HelloWorld extends JFrame{
// コンストラクタ
public HelloWorld() {
initComponents();
}
// フォーム初期化処理
private void initComponents() {
jLabel1 = new JLabel();
jMenuBar1 = new JMenuBar();
jMenu1 = new JMenu();
jMenu2 = new JMenu();
jMenuItem1 = new JMenuItem();
jMenuItem2 = new JMenuItem();
setTitle("Hello World!");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel1.setText("Hello World!");
getContentPane().add(jLabel1);
// メニューを作る
setJMenuBar(jMenuBar1);
jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenuItem1.setText("Exit");
jMenu1.add(jMenuItem1);
jMenu2.setText("Help");
jMenuBar1.add(jMenu2);
jMenuItem2.setText("About");
jMenu2.add(jMenuItem2);
pack();
}
// コマンドライン引数の処理
public static void main(String[] args) {
new HelloWorld().show();
}
// 変数宣言
private JLabel jLabel1;
private JMenuBar jMenuBar1;
private JMenu jMenu1, jMenu2;
private JMenuItem jMenuItem1, jMenuItem2;
}
メニューからアプリケーションを終了させる処理を呼び出すコードを追加します。つまり、メニューオブジェクトに ActionListener を登録します。一般的には、ActionListener インターフェースから匿名内部クラス(anonymous inner class)を作成し、actionPerformed メソッドを定義し、その内部にイベント処理を記述します。
イベントが発生すると、イベントソースやイベントの種類等の情報を保持した ActionEvent オブジェクトが生成され、これがイベントリスナーに渡されます。
ActionListener インターフェースや ActionEvent クラスを使うには、java.awt.event.* をインポートしなければなりません。
import javax.swing.*;
import java.awt.event.*;
public class HelloWorld extends JFrame{
// コンストラクタ
public HelloWorld() {
initComponents();
}
// フォーム初期化処理
private void initComponents() {
jLabel1 = new JLabel();
jMenuBar1 = new JMenuBar();
jMenu1 = new JMenu();
jMenu2 = new JMenu();
jMenuItem1 = new JMenuItem();
jMenuItem2 = new JMenuItem();
setTitle("Hello World!");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel1.setText("Hello World!");
getContentPane().add(jLabel1);
setJMenuBar(jMenuBar1);
jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenuItem1.setText("Exit");
// メニューが作るイベント処理
jMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
exitForm(evt);
}
});
jMenu1.add(jMenuItem1);
jMenu2.setText("Help");
jMenuBar1.add(jMenu2);
jMenuItem2.setText("About");
jMenu2.add(jMenuItem2);
pack();
}
// アプリケーション終了処理
private void exitForm(ActionEvent evt) {
System.exit(0);
}
// コマンドライン引数の処理
public static void main(String[] args) {
new HelloWorld().show();
}
// 変数宣言
private JLabel jLabel1;
private JMenuBar jMenuBar1;
private JMenu jMenu1, jMenu2;
private JMenuItem jMenuItem1, jMenuItem2;
}
Helpメニューの"About"を、メッセージダイアログで表示させてみます。
import javax.swing.*;
import java.awt.event.*;
public class HelloWorld extends JFrame{
// コンストラクタ
public HelloWorld() {
initComponents();
}
// フォーム初期化処理
private void initComponents() {
jLabel1 = new JLabel();
jMenuBar1 = new JMenuBar();
jMenu1 = new JMenu();
jMenu2 = new JMenu();
jMenuItem1 = new JMenuItem();
jMenuItem2 = new JMenuItem();
setTitle("Hello World!");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel1.setText("Hello World!");
getContentPane().add(jLabel1);
setJMenuBar(jMenuBar1);
jMenu1.setText("File");
jMenuBar1.add(jMenu1);
jMenuItem1.setText("Exit");
jMenuItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
exitForm(evt);
}
});
jMenu1.add(jMenuItem1);
jMenu2.setText("Help");
jMenuBar1.add(jMenu2);
jMenuItem2.setText("About");
jMenuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
showAbout(evt);
}
});
jMenu2.add(jMenuItem2);
pack();
}
// アプリケーション終了処理
private void exitForm(ActionEvent evt) {
System.exit(0);
}
// ヘルプ表示
private void showAbout(ActionEvent evt) {
JOptionPane.showMessageDialog(this, "Hello World Application.");
}
// コマンドライン引数の処理
public static void main(String[] args) {
new HelloWorld().show();
}
// 変数宣言
private JLabel jLabel1;
private JMenuBar jMenuBar1;
private JMenu jMenu1, jMenu2;
private JMenuItem jMenuItem1, jMenuItem2;
}