Javaのデスクトップアプリの作り方 その2

前回の記事では、デスクトップアプリに「Hello World」と表示させるところまで実装しました。
今回からもう少しアプリに処理を追加していきます。

今回は下記を目標に実装を進めていきます。

  • 画面にテキストボックスを追加する
  • 画面にボタンを追加する

前回の記事はこちらから参照ください。

olafnosuke.hatenablog.com

前回の実装修正

実際の内容に入る前に前回の記事について一部修正するところから始めます。。
前回の記事では以下の実装で完了としていましたが「JFrame」はnewするのではなくて継承(extends)して使うのが一般的なようです。

package desktopApp;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main {

    public static void main(String[] args) {
        // コンストラクタの引数でアプリタイトルを設定
        JFrame frame = new JFrame("デモアプリ");
        // デスクトップに表示する画面のサイズ(幅,高さ)
        frame.setSize(500, 500);

        // このウィンドウをデスクトップ上に表示する
        frame.setVisible(true);

        // 画面上下左右中央にウィンドウを表示させる
        frame.setLocationRelativeTo(null);

        // 「X」ボタンで画面を閉じたらアプリケーションを終了させる
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 画面上に表示するメッセージ
        JLabel label = new JLabel("Hello World");

        // メッセージを画面上部に表示させる
        label.setVerticalAlignment(JLabel.TOP);

        // 画面にメッセージを追加する
        frame.add(label);
    }
}

なのでまずは上記の実装を一般的な実装に修正しましょう。

JFrameをextendsする

「JFrame」クラスをextendsして、コンストラクタを宣言します。
コンストラクタの処理はこれから追加していきます。

// 「JFrame」クラスをextendsする
public class Main extends JFrame {
    // コンストラクタを追加
    // 後でmainメソッドの一部処理をこちらに移動させます。
    Main() {
    }
}

コンストラクタへ処理を移動

以下の処理をコンストラクタへ移動させる。
移動させると「frame」がコンパイルエラーになるので削除する。

// デスクトップに表示する画面のサイズ(幅,高さ)
frame.setSize(500, 500);

// このウィンドウをデスクトップ上に表示する
frame.setVisible(true);

// 画面上下左右中央にウィンドウを表示させる
frame.setLocationRelativeTo(null);

// 「X」ボタンで画面を閉じたらアプリケーションを終了させる
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 画面上に表示するメッセージ
JLabel label = new JLabel("Hello World");

// メッセージを画面上部に表示させる
label.setVerticalAlignment(JLabel.TOP);

// 画面にメッセージを追加する
frame.add(label);

移動後は以下のようになっていればOK

package desktopApp;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    Main() {
        // デスクトップに表示する画面のサイズ(幅,高さ)
        setSize(500, 500);

        // このウィンドウをデスクトップ上に表示する
        setVisible(true);

        // 画面上下左右中央にウィンドウを表示させる
        setLocationRelativeTo(null);

        // 「X」ボタンで画面を閉じたらアプリケーションを終了させる
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 画面上に表示するメッセージ
        JLabel label = new JLabel("Hello World");

        // メッセージを画面上部に表示させる
        label.setVerticalAlignment(JLabel.TOP);

        // 画面にメッセージを追加する
        add(label);
    }

    public static void main(String[] args) {
        // コンストラクタの引数でアプリタイトルを設定
        JFrame frame = new JFrame("デモアプリ");
    }
}

mainメソッドでnewするクラスを変更する

mainメソッド内では「JFrame」クラスがnewされているが、先ほど追加したコンストラクタでインスタンスを作成するように実装を修正する。

new Main();

JFrameのコンストラクタの引数に指定しているのはアプリのタイトルである。
これを消してしまうとタイトルバーに表示されていた文字列も消えてしまうのでコンストラクタ側に以下の処理を追加する。

// タイトル
setTitle("デモアプリ");

メッセージ表示の実装修正

ラベル等の画面項目はJFrameに直接ではなくコンテナに対して追加する。
下記の「追加」で囲まれている処理を追加する。

また、メッセージ表示処理の位置もタイトル等アプリ全体設定よりも前に移動した。
(この後テキストボックスやボタンを追加するにあたって、アプリ全体設定よりも前に記載がないとうまく表示されないため)

package desktopApp;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {

    Main() {

        // ↓追加
         Container contentPane = getContentPane();
        // レイアウトを設定
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
        // ↑追加

        // 画面上に表示するメッセージ
        JLabel label = new JLabel("Hello World");
        // ↓追加
        contentPane.add(label);
        // ↑追加

        // タイトル
        setTitle("デモアプリ");

        // デスクトップに表示する画面のサイズ(幅,高さ)
        setSize(500, 500);

        // このウィンドウをデスクトップ上に表示する
        setVisible(true);

        // 画面上下左右中央にウィンドウを表示させる
        setLocationRelativeTo(null);

        // 「X」ボタンで画面を閉じたらアプリケーションを終了させる
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

これで修正は完了である。
アプリを実行してみて前回と同じように画面上に「Hello World」と表示されたら成功。


画面にテキストボックスを追加する

「JTextField」でテキストボックスを配置することができる。
引数に与えている数値は表示される文字数である。(ただし設定した文字数がちゃんと表示されるかはフォント次第)

JTextField textField = new JTextField(15);
contentPane.add(textField);


画面にボタンを追加する

「JTextField」でボタンを配置することができる。
引数でボタンに表示する文字列を指定できる。

JButton button = new JButton("OK");
contentPane.add(button);

package desktopApp;

import java.awt.Container;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main extends JFrame {

    Main() {
        Container contentPane = getContentPane();

        // レイアウトを設定
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));

        // 画面上に表示するメッセージ
        JLabel label = new JLabel("Hello World");
        contentPane.add(label);

        // テキストボックス
        JTextField textField = new JTextField(15);
        contentPane.add(textField);

        // ボタン
        JButton button = new JButton("OK");
        contentPane.add(button);

        // タイトル
        setTitle("デモアプリ");
        // デスクトップに表示する画面のサイズ(幅,高さ)
        setSize(500, 500);
        // このウィンドウをデスクトップ上に表示する
        setVisible(true);
        // 画面上下左右中央にウィンドウを表示させる
        setLocationRelativeTo(null);
        // 「X」ボタンで画面を閉じたらアプリケーションを終了させる
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

今回はここまで。
次回は下記を目標に実装を進めていきます。

  • ボタン押下で画面遷移する
  • 画面遷移時に値を受け渡す

参考

とほほのJava入門 - とほほのWWW入門