Java SE 6でのSwingの新機能を4カ月間,AWTも加えると半年にわたって紹介してきました。この連載を執筆するまで,筆者もここまで多くの新機能があるとは思っていませんでした。

そのJava SE 6のGUIの新機能も今週で終わりです。今週はちょっとした新機能を四つ取り上げます。

ButtonGroup#clearSelection

ButtonGroupクラスを使うと,ラジオボタンやチェックボックスを排他的に選択できるようになります。つまり,あるボタンを選択すると他のボタンをすべて非選択状態にできます。

使い方は,単にButtonGroupオブジェクトを生成して,そこにボタン(AbstractButtonクラスを派生させたクラスのオブジェクト)をaddメソッドで追加するだけです。

簡単に使えて便利なのですが,反面,困ったことがありました。すべてのボタンを非選択状態に戻すことができなかったのです。

ButtonGroupクラスでボタンをまとめる場合,デフォルトの初期状態では,すべてのボタンが非選択状態になっています。

ところが,ボタンを1度でも選択してしまうと,簡単には初期状態に戻せないのです。

Java SE 6ではそれができるようになりました。

サンプルのソースコード ButtonGroupSample.java

サンプルには,三つのラジオボタンと,もう一つ「選択状態をクリアするためのボタン」があります(図1)。

選択状態をクリアするときには赤字で示したように,clearSelectionメソッドをコールだけです。

group = new ButtonGroup();
group.add(button1);
group.add(button2);
group.add(button3);

JButton clearButton = new JButton("Clear Selection");
clearButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent event) {
        // 選択をクリアする
        group.clearSelection();
    }
});

図1のようにラジオボタンが選択されていても,[Clear Selection]をクリックすると,非選択状態になります(図2)。

ボタンを選択
図1 ボタンを選択
選択をクリア
図2 選択をクリア

ウィンドウの最小サイズ

次に紹介するのが,ウィンドウの最小サイズの設定です。実をいうとこれはAWTの機能なのですが,すっかり紹介するのを忘れていたのです。

サンプルのソースコード WindowSizeSample.java

こちらも単に一つのメソッドをコールするだけです。

public WindowSizeSample (String imagefile) {
    JFrame frame = new JFrame("Window Size Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label = new JLabel(new ImageIcon(imagefile));
    frame.add(label);

    frame.setMinimumSize(new Dimension(200, 150));

    frame.pack();
    frame.setVisible(true);
}

赤字で示したように,最小のウィンドウサイズを200×150に設定しています。

ここではJFrameオブジェクトに対して最小サイズを設定しています。ただ,setMinimumSizeメソッドはWindowクラスで定義されているので,Windowクラスを派生させたクラスであれば最小サイズを設定できます。

さて,実際に実行してみましょう。

図3が初期状態,図4が最小サイズを設定していない場合,図5が最小サイズを設定しているものです。

このサンプルでは,最小サイズを設定することにはほとんど意味はありません。しかし,必ず表示しなくてはならない要素がある場合,最小サイズを設定することは重要です。

初期状態
図3 初期状態
最小サイズを設定していない場合 最小サイズを設定した場合
図4 最小サイズを設定していない場合 図5 最小サイズを設定した場合

No More Gray Rect!

No More Gray Rect!というのはSwingのエンジニアであるScott Violet氏のブログエントリーのタイトルです。No Moreはともかく「Gray Rect」が何なのかよくわかりませんね。

Gray Rectはウィンドウの中で再描画が追いつかずに灰色のままになっている状態を指しています。

この状態を再現するのは簡単です。Windowsであれば,ALT+TABでアプリケーションを切り替えてみてください。バッググラウンドで動作させていたJavaのアプリケーションをフォアグラウンドにすると,いままでウィンドウが重なっていた部分が一瞬再描画されずに灰色のままになるのが確認できるはずです(図6)。

Java SE 6では,灰色のままになっている時間がかなり短くなっています。これは,リペイント・マネージャなどの応答性を向上させたからにほかなりません。

このほか,複数のウィンドウを使用するアプリケーションの場合,ウィンドウごとにダブルバッファリング用のバッファを持つように変更されています。この変更もパフォーマンスの向上に役立っています。

これが Gray Rect
図6 これが Gray Rect

Windows Vista,GTKに対応したルック&フィール

Java SE 6はWindows Vistaに正式対応しています。32bit版のVistaだけでなく,64bit版のVistaにも対応しています。これに応じてSwingのWindowsスタイルのルック&フィールもVistaに対応しました。

また,GTKのLook&Feelへの対応度も増しています。

それでは,実際にどの程度対応しているのかを見てみましょう。

まずはWindows Vistaです。実をいうと,J2SE 5.0の最新版(原稿執筆時はJ2SE 5.0 Update12)は,すでにVistaへの対応がバックポートされています。このため,アップデートされていない素のJ2SE 5.0を使用しました。

ここではJ2SE 5.0に付属しているサンプルのSwingSet2を使います。SwingSe2はメニューバーに「ルック&フィール」という項目があります。このメニューから,Windowsスタイルのルック&フィールに変更できます。

図7にSwingSet2のファイル・チューザを示します。

Vistaのルック&フィールとは全くかけ離れていることがわかります。また,ルック&フィールにWindows Aeroを使用していても,Aeroには対応できないため,強制的にベーシックに移行してしまいます(図8)。

一方,Java SE 6で実行したものが図9です。Vistaのルック&フィールが再現されていることがわかります。また,Aeroもそのまま使用できます。

J2SE 5.0をVistaで実行
図7 J2SE 5.0をVistaで実行
Aeroだと警告が発生する
図8 Aeroだと警告が発生する
Java SE 6をVistaで実行
図9 Java SE 6をVistaで実行

GnomeでJava SE 6のSwingSet2を実行したのが図10です。J2SE 5.0ではボタンが単純な四角だったのに対し,角丸四角に変更されているなど,よりGTKのルック&フィールに近づいていることがわかります。

Java SE 6をGnomeで実行
図10 Java SE 6をGnomeで実行

さて,GUI編はこれで終了です。来月からは,java.langやjava.io,java.utilといったコアライブラリの新機能を紹介していきます。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

毎年,JavaOneに参加すると,自分の英語力のなさを思い知ります。

JavaOneにはそれこそ世界中からJavaの技術者が集まってきます。ランチ会場やパビリオンなどで,参加者同士で議論が始まったりします。そういう場になかなか入っていけないのです。

毎年,英語を勉強しなくてはと思うのですが,それが長続きしたことはありません。長続きしていれば,もうペラペラになっているはずなのですが…

5月30日にJavaOne報告会が行われ,その中のライトニングトークで複数の講師がニンテンドーDSのえいご漬けを購入したと話していました。やっぱり,みな考えることは同じなのかもしれませんね。