Java

はじめに

TIOBE Programming Community Index によると、Java 言語は 10 年以上の間、最もポピュラーなプログラミング言語の一つであり続けています。事実、Java に関する情報は巷にあふれていて、優れた解説がされたサイトは数多あります。

そんな中で今さら、という気がしないわけでもありませんが、それでも GUI (Graphical User Interface) と数値計算に特化した情報を中心に、自分が理解しているものを整理するためにまとめた内容を公開しています。

動作環境

Java は、マルチプラットフォームに対応していますが、ここでは原則として Linux (Fedora) 上で確認した結果を紹介しています。開発環境には Eclipse を使用しています。

Fedora 21 上で利用している Eclipse

コーディングスタイル

コーディングスタイルと言うほど大それたものではありませんが、比較的小さな同じようなサンプルをいくつも紹介するにあたって、 クラスの記述の仕方は統一しておいた方が良いと考えて以下のようにしています。サンプルだからと言って、安易に main メソッドにいろいろな処理を記述しないようにしています。以下のサンプルのコメントをご覧ください。

Java_version.java

package version;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.Border;

class Java_version extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;

    // クラス内で使用するインスタンスは、クラスの先頭にまとめて宣言して
    // います。
    JMenuBar mbar;
    JMenu menu_file;
    JMenuItem item_exit;
    JLabel lab[] = new JLabel[4];
    JButton but;

    // コンストラクタ
    // コンストラクタでメインとなるGUIの設定をします。
    Java_version() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Java version");

        // メニューバーの作成
        // コンストラクタ内に記述すると煩雑になり、可読性が落ちると
        // 考えられる場合は、メソッドを呼び出すようにしています。
        // このようなメソッドは、通常はインスタンスの生成後に一回
        // しか実行されません。
        createMenubar();

        // Java のバージョンとオペレーションシステムの情報をラ
        // ベルに設定
        lab[0] = new JLabel("Java version");
        lab[1] = new JLabel(System.getProperty("java.version"));
        lab[2] = new JLabel("OS");
        lab[3] = new JLabel(System.getProperty("os.name"));

        Border paddingBorder = BorderFactory.createEmptyBorder(2, 10, 2, 10);
        Border border = BorderFactory.createLineBorder(Color.BLACK);

        // パネル p1
        // パネルのようにレイアウトにしか使われないインスタンスは、
        // コンストラクタ内で宣言してしまいます。
        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(2, 2));
        for (JLabel l : lab) {
            l.setBorder(BorderFactory.createCompoundBorder(border,
                    paddingBorder));
            p1.add(l);
        }

        // パネル p2
        JPanel p2 = new JPanel();
        p2.setLayout(new BoxLayout(p2, BoxLayout.LINE_AXIS));

        p2.add(Box.createGlue());

        // 終了ボタン
        but = new JButton("Exit");
        but.addActionListener(this);
        p2.add(but);

        // パネルの配置
        getContentPane().add(p1, BorderLayout.CENTER);
        getContentPane().add(p2, BorderLayout.SOUTH);
        // 好みの問題ですが、本サイトのサンプルでは、ほとんどの場合
        // 固定されたGUIのサイズを指定しないようにしています。
        pack();
    }

    // メニューバーの作成
    // コンストラクタから実行されるこのメソッドは、通常はインスタンスの
    // 生成時に一回しか実行されません。
    void createMenubar() {
        // メニューバー
        mbar = new JMenuBar();

        // File メニュー
        menu_file = new JMenu("File");
        menu_file.setMnemonic(KeyEvent.VK_F);
        mbar.add(menu_file);

        // Exit メニューアイテム on File メニュー
        item_exit = new JMenuItem("Exit");
        item_exit.setMnemonic(KeyEvent.VK_X);
        item_exit.addActionListener(this);
        menu_file.add(item_exit);

        // メニューバーの設定
        setJMenuBar(mbar);
    }

    // イベント処理
    // どのようなイベントかを識別する方法はいろいろあり、用途に応じて
    // 使い分ければ良いのですが、本サイトのサンプルでは、イベントが発生
    // したインスタントを識別して、インスタントに応じて処理をするように
    // 統一しています。
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == but) {
            appExit(exitDialog());
        } else if (e.getSource() == item_exit) {
            appExit(JOptionPane.YES_OPTION);
        }
    }

    // 終了確認用ダイアログ
    int exitDialog() {
        Font dialogFont = new Font(Font.DIALOG, Font.BOLD, 13);
        JLabel msg = new JLabel("終了してよろしいですか?");
        msg.setFont(dialogFont);
        return (JOptionPane.showConfirmDialog(this, msg, "終了確認",
                JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE));
    }

    // 終了処理
    void appExit(int flag) {
        if (flag == JOptionPane.YES_OPTION) {
            System.out.println("アプリケーションを終了します。");
            System.exit(0);
        } else {
            System.out.println("アプリケーションの終了はキャンセルされました。");
        }
    }

    // メインメソッド
    // メインメソッドは、クラスの中のどこに記述しても良いのですが、
    // 本サイトのサンプルではクラスの最後(一番下)に記述するように統一
    // しています。
    public static void main(String[] args) {
        // メインメソッドでは、クラスのインスタンスを生成して、
        // それを表示するだけです。
        Java_version w = new Java_version();
        w.setVisible(true);
    }
}

Java_version.class の実行例

関連サイト