Swing GUI のルックアンドフィールの設定
Swing のルックアンドフィールとは?
Swing を使うとアプリケーションの「見た目」や、それぞれの GUI 要素の「動き方」を自在に指定することが可能になります。
「見た目」のことを Look、「動き方」のことを Feel と呼び、これらをまとめてルックアンドフィールと呼びます。省略する時は頭文字をとって、L&F などと書いたりします。
ルックアンドフィールを変更するには、UIManager クラスの setLookAndFeel メソッドを呼びます。
setLookAndFeel の引数にはルックアンドフィールを実装したクラス名を指定します。
Oracle JRE が提供している L&F クラスには次があります。
- javax.swing.plaf.metal.MetalLookAndFeel
クロスプラットフォーム L&F。 - com.sun.java.swing.plaf.motif.MotifLookAndFeel
Motif もクロスプラットフォーム。 - com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Linux で GTK+ 向けの L&F。GTK+ 2.2 以降。 - com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Windows 向けの L& F。
まず、基本的な考え方として次の二つがあります。クロスプラットフォーム L&F と システム L&Fです。
クロスプラットフォームの L&F は Java L&F (または メタル) というルックアンドフィールで、 Java API の一部になってます。クロスプラットフォームで同じように動かしたい場合はこれを明示的に選ぶといいです。
一方、システム L&F はプログラムが現在実行されているプラットフォームネイティブのルックアンドフィールになります。 つまり、Linux では Linux らしく、Windows では Windows らしく動かすということです。
WIndows と Linux での実行例
では、具体的にみてみましょう。
私の Linux (Ubuntu 16.04) 上で、ルックアンドフィールを何も指定しないで、JFrame にボタン JButton が二つあるだけのウィンドウを作成すると、 後述のコードを起動すると次のようになりました。Java L&F (メタル) です。
現在のシステム L&F を指定すると、次のようになりました。これは GTK+ L&F です。
同様に Windows 上でも実行すると、メタル、Windows はそれぞれ次のようになりました。
メタルは確かに Linux 上でも Windows 上でも似たようなグラデーションのボタンになっています。 また、それぞれシステム L&F を指定すると、Windows らしく、あるいは Linux (Ubuntu) らしい表示になっています。
Swing GUI のルックアンドフィールの指定方法
次のコードでは setLAF というメソッド作り、そこで UIManager の setLookAndFeel メソッドを呼び出すことで、ルックアンドフィールを指定しています。
実行環境によってクラスが存在したりしなかったりするので、try-catch で囲っています。
package com.keicode.java.testapp;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
@SuppressWarnings("serial")
public class LAFTest1 extends JFrame {
public LAFTest1() {
setLAF();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setSize(350, 200);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
panel.add(new JButton("OK"));
panel.add(new JButton("Cancel"));
add(panel,BorderLayout.SOUTH);
}
void setLAF() {
try {
System.out.println(UIManager.getSystemLookAndFeelClassName());
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
//com.sun.java.swing.plaf.gtk.GTKLookAndFeel
//com.sun.java.swing.plaf.motif.MotifLookAndFeel
//com.sun.java.swing.plaf.windows.WindowsLookAndFeel
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
LAFTest1 app = new LAFTest1();
app.setVisible(true);
}
});
}
}
現在のシステムのルックアンドフィールクラスを取得するメソッドは UIManager の getSystemLookAndFeelClassName メソッドです。
ルックアンドフィールの使い分けとしては、多くの人が複数の環境で同じソフトウェアを使わねばならない環境ではメタルを指定、 それぞれの人が特定の環境でソフトウェアを利用する場合が多い場合はシステム L&F を指定する、というのが基本になるかと思います。