フレームウィンドウのLook&Feelを設定する

広告

Look&Feelを切り替えてもアプリケーションの一番外枠であるフレームの外観は変更されません。ここではフレームの外観についても変更する方法を確認します。

まずLookAndFeelクラス毎にフレームの外枠のLook&Feelを提供しているかどうかを確認します。LookAndFeelクラスで提供されている「getSupportsWindowDecorations」メソッドを使います。

public boolean getSupportsWindowDecorations()

LookAndFeel が返す RootPaneUI インスタンスが JRootPane での ウィンドウ
装飾の提供をサポートする場合、true を返します。

デフォルトの実装は false を返します。ウィンドウ 装飾をサポートするサブ
クラスは、この実装をオーバーライドし、true を返すようにします。

戻り値:
  この Look & Feel によって作成された RootPaneUI インスタンスがクライア
    ント側の装飾をサポートする場合、true

LookAndFeelクラスを実装したクラスがフレームの外枠まで用意されている場合はこのメソッドで「true」を返します。実際に試してみるとこのメソッドで「true」を返すクラスは「javax.swing.plaf.metal.MetalLookAndFeel」だけです。

※確認したプログラムは下記の通りです。LookAndFeelクラスのオブジェクトを作成する方法が分からなかったので、Look&Feelを変更してから現在設定されているLookAndFeelクラスのオブジェクトを取り出し、そして「getSupportsWindowDecorations」メソッドを実行するという変なプログラムになっています。

UIManagerTest4.java

利用できるLook&Feelが分かったのでフレームの外観にもLook&Feelが適用されるようにしてみます。JFrameクラスで用意されている「setDefaultLookAndFeelDecorated」メソッドを使います。

public static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated)

新しく作成された JFrame が、現在の Look & Feel によって提供されるウィン
ドウ修飾 (境界、ウィンドウをクローズするウィジェット、タイトルなど) を
備えるかどうかについてのヒントを提供します。defaultLookAndFeelDecorated
が true の場合、現在の LookAndFeel はウィンドウ修飾の提供をサポートし、
現在のウィンドウマネージャーは修飾されていないウィンドウをサポートしま
す。したがって、新しく作成された JFrame は現在の LookAndFeel によるウィ
ンドウ修飾を持ちます。そうでない場合は、新しく作成された JFrame のウィ
ンドウ修飾は現在のウィンドウマネージャーによって提供されます。

単一の JFrame に対しても次を実行することにより、同じ効果を得られます。 

  JFrame frame = new JFrame();
  frame.setUndecorated(true);
  frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);

パラメータ:
  defaultLookAndFeelDecorated - 現在の Look & Feel がウィンドウ装飾を提
    供するかどうかのヒント

このメソッドはstaticメソッドとなっています。引数に「true」を設定するとJFrameクラスのオブジェクトを作成した場合に、フレームの外観が現在設定されているLook&Feelによって設定されるようになります。JFrameクラスのオブジェクトを作成する前に設定が行われている必要がありますので注意して下さい。

実際の使い方は次のようになります。

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame();

サンプルプログラム

では簡単なサンプルを作成して試してみます。

UIManagerTest5.java

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Vector;

public class UIManagerTest5 extends JFrame{

  public static void main(String[] args){
    JFrame.setDefaultLookAndFeelDecorated(true);

    UIManagerTest5 frame = new UIManagerTest5();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  UIManagerTest5(){

    JButton button = new JButton("button");

    JPanel p = new JPanel();
    p.add(button);

    getContentPane().add(p, BorderLayout.CENTER);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

UIManagerでフレームの外観も変更する

デフォルトのLookAndFeelである「Metal」によって用意されたLook&Feelにフレームの外観が変更されています。

次の画像は外観を変更しなかった場合です。比較してどこが変わっているか確認して下さい。

UIManagerでフレームの外観も変更する

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。