スポンサードリンク

Java Look&Feelでウィンドウの外観を変える方法。

Javaの Swing で作った画面は、プラットホームに依存しない外観になります。しかし普段ユーザーが使い慣れている OS の画面とあまりにも違うと違和感があります。

そこで Java では外観を決める複数の Look&Feel を用意し、ユーザーが好みのタイプを選択できるようにしています。

以下はこれまでに作った AWT と Swing の外観ですが、今回 Look&Feel を適用した後に比べてみてください。

・AWT でダイアログボックスは Dialog クラスの場合
java-556.gif


・Swing でダイアログボックスは JDialog クラスと JOptionPane クラスの場合
java-557.gif


【1】sample212 フォルダをフォルダごとコピーして、sample213 フォルダを作ります。

java-549.gif


【2】今回は以下のようなファイル構成になりますので、コピーした余計なものは削除してください。

java-550.gif

*SampleDb030.class を忘れないようにしてください。


【3】PrefTest.java を以下のように変更します。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample213
ファイル名 PrefTest.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

class PrefFrame extends JFrame implements ActionListener {
  Container cp;
  JLabel lb1;
  JTextArea txtar1;
  JButton btn1, btn2, btn3;
  JMenuItem mi1, mi2, mi3, mi4, mi5, mi6,mi7;

  public PrefFrame(String title) {
    //フレームのタイトル
    setTitle(title);

    //コンテンツペイン取得
    cp = getContentPane();

    //ウィンドウを閉じる時
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        showExitDialog();
      }
    });

    //Look&Feelの設定
    String type = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
    try {
      UIManager.setLookAndFeel(type);
    } catch ( Exception e ) {
      System.out.println("例外発生:" + e );
    }

    //メニューバーの生成
    JMenuBar mb = new JMenuBar();

    //メニューの生成
    JMenu mn1 = new JMenu("ファイル");
    JMenu mn2 = new JMenu("編集");
    JMenu mn3 = new JMenu("検索");

    //メニュー項目の生成
    mi1 = new JMenuItem("表示");
    mi2 = new JMenuItem("クリア");
    mi3 = new JMenuItem("終了");
    mi4 = new JMenuItem("追加");
    mi5 = new JMenuItem("更新");
    mi6 = new JMenuItem("削除");
    mi7 = new JMenuItem("検索");

    //イベントリスナーの登録
    mi1.addActionListener(this);
    mi2.addActionListener(this);
    mi3.addActionListener(this);

    //メニューへの追加
    mn1.add(mi1);
    mn1.add(mi2);
    mn1.addSeparator(); //セパレーター
    mn1.add(mi3);

    mn2.add(mi4);
    mn2.add(mi5);
    mn2.add(mi6);

    mn3.add(mi7);

    //メニューバーへの追加
    mb.add(mn1);
    mb.add(mn2);
    mb.add(mn3);

    //メニューバーをフレームへ追加
    setJMenuBar(mb);


    //ラベル
    lb1 = new JLabel("ボタンをクリックしてください。", SwingConstants.CENTER);
    lb1.setOpaque(true);
    lb1.setFont(new Font("Serif", Font.BOLD, 12));
    lb1.setBackground(Color.WHITE);
    lb1.setForeground(Color.BLUE);
    cp.add(lb1, BorderLayout.NORTH);

    //テキストエリア
    txtar1 = new JTextArea();
    txtar1.setFont(new Font("Dialog", Font.PLAIN, 14));
    txtar1.setForeground(new Color(64, 64, 64));
    cp.add(txtar1, BorderLayout.CENTER);

    //パネル
    JPanel pn1 = new JPanel();
    pn1.setLayout(new GridLayout(1, 3));

    //ボタンの設定
    btn1 = new JButton("表示");
    btn2 = new JButton("クリア");
    btn3 = new JButton("終了");

    btn3.setForeground(new Color(255, 0, 0));

    btn1.addActionListener(this);
    btn2.addActionListener(this);
    btn3.addActionListener(this);

    pn1.add(btn1);
    pn1.add(btn2);
    pn1.add(btn3);

    //パネルを追加
    cp.add(pn1, BorderLayout.SOUTH);

  }

  public void actionPerformed (ActionEvent e) {
    Object obj = e.getSource();
    if (obj == btn1 || obj == mi1) {
      prefDisplay();
      lb1.setText("表示しました。");
    }else if (obj == btn2 || obj == mi2) {
      txtar1.setText("");
      lb1.setText("クリアしました。");
    }else if (obj == btn3 || obj == mi3) {
      showExitDialog();
    }
  }

  private void prefDisplay () {
    try {
      //データベースに接続
      Connection con = SampleDb030.getConnection();
      //ステートメントオブジェクトを作成
      Statement stmt = con.createStatement();

      //SQL文作成
      String mySql = "select * from T01Prefecture order by PREF_CD";
      //検索するSQL実行
      ResultSet rs = stmt.executeQuery(mySql);

      StringBuffer temp  = new StringBuffer();

      //結果セットからデータを取り出す next()で次の行に移動
      while(rs.next()) {
        int prefCd = rs.getInt("PREF_CD");
        String prefName = rs.getString("PREF_NAME");
        temp.append(prefCd + "\t");
        temp.append(prefName + "\n");
      }

      txtar1.setText(temp.toString());

      //オブジェクトを解放
      rs.close();
      stmt.close();
      con.close();

    } catch (Exception e) {
      System.out.println("例外発生:" + e );
    }
  }

  private void showExitDialog () {
    //終了ダイアログボックスの表示
    int ret = JOptionPane.showConfirmDialog (cp, "プログラムを終了しますか?", "確認", JOptionPane.YES_NO_OPTION);

    if(ret == JOptionPane.YES_OPTION) {
      System.exit(0);
    }

  }

}


public class PrefTest {

  public static void main(String args[]) {
    PrefFrame frm = new PrefFrame("都道府県マスター");
    //フレームの設定
    frm.setLocation(300, 200);
    frm.setSize(250, 350);
    frm.cp.setBackground(Color.LIGHT_GRAY);
    frm.setVisible(true);
  }

}



【4】コマンドプロンプトを起動して、カレントディレクトリを sample213 に切り替えます。

java-551.gif


【5】javac PrefTest.java と入力し、コンパイルします。

java-552.gif


【6】java PrefTest と入力し、プログラムを実行します。

java-553.gif


【7】都道府県マスターが表示されました。ウィンドウの外観が変わりました。

java-554.gif


【8】データを表示したり、ダイアログボックスを表示して、デザインを確認してください。


【解説】

(1)Look&FeelでWindows タイプにすると、Windowsユーザーに馴染みのある外観とボタンになりました。

・Swing でダイアログボックスは JOptionPane クラス + Look&Feel(Windows タイプ)
java-558.gif


(2)Look&Feelを設定している部分です。type に代入する値を変えると、外観を変えることができます。また UIManager クラスの setLookAndFeel() メソッドは例外が発生する可能性があるので、try-catch文で囲んでいます。

String type = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
try {
  UIManager.setLookAndFeel(type);
} catch ( Exception e ) {
  System.out.println("例外発生:" + e );
}


(3)type に指定できる文字列
・Windows タイプ
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
・Metal タイプ(Javaの標準)
javax.swing.plaf.metal.MetalLookAndFeel
・UNIX タイプ
com.sun.java.swing.plaf.motif.MotifLookAndFeel

・Motif タイプ(すべてで使える)
com.sun.java.swing.plaf.motif.MotifLookAndFeel

*Swingでは「Metal」がデフォルトです。またOSにより使える Look&Feel が異なります。他にもMacタイプやLinuxタイプがあります。


スポンサードリンク






Java初心者入門講座TOPへ