Java

[Fedora 16]
Java  

はじめに

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

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

なかなか時間を取れず、カバーしたい内容の全部を網羅することができませんので、常に準備中です。

ページ先頭に戻る

動作環境

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

eclipse.png

Fedora 16 上で利用している Eclipse

ページ先頭に戻る

コーディングスタイル

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

List: Java_version.java

// インポートするパッケージの指定には、* を使わない方が良いと書かれている
// 説明がありますが、サンプルが長くなるので、* で済ませてしまっています。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

class Java_version extends JFrame implements ActionListener {
    // クラス内で使用するインスタンスは、クラスの先頭にまとめて宣言して
    // います。
    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.png

Java_version.class の実行例

このサイトのサンプルでは考慮をしていませんが、以下のような記事がありますので、メインメソッドの記述の仕方に注意が必要です。

ページ先頭に戻る
(C) 2009 - 2017 Fuhito Suguri
クリエイティブ・コモンズ・ライセンス
This site by Fuhito Suguri is licensed under a Creative Commons 表示 - 継承 3.0 Unported License.
Ads by Sitemix