倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

JOptionPane の使い方が悲しいくらい分かりにくい! (4) : Option Dialog

JOptionPane 最後のダイアログは Option Dialog

Option Dialog は前回までにやった3つのダイアログ (Message Dialog, Confirm Dialog, Input Dialog) を統合したようなダイアログです。 引数を変えることによってそれぞれを再現できます。 とは言っても、単なる再現だと敢えてこのメソッドを使用する必要性を感じないので、ここでは Option Dialog だけしか作れないダイアログを見ていきます。

Option Dialog でのみ作成できるダイアログは、オプション(「了解」や「取消し」などのボタン)を独自のものにしたダイアログです(さすが“オプション”ダイアログ)。

Option Dialog


Option Dialog を作成するには JOptionPane クラスの static メソッド showOptionDialog() を使用します。 メソッドのシグニチャは以下のようになってます:

static int showOptionDialog(
    Component parent, 
    Object message,
    String title,
    int optionType,
    int messageType,
    Icon icon,
    Object[] options,
    Object initialValue) 

引数の詳細は下表の通り:

引数 説明
parent java.awt.Component 親となる GUI コンポーネント
message Object メッセージ
title String ダイアログのタイトル
optionType int オプションのタイプ
messageType int メッセージタイプ
icon javax.swing.Icon ダイアログに表示されるアイコン
options Object[] オプションの配列
initialValue Object オプションの初期値

optionType はこちら、messageType はこちらを参照のこと。
また、返り値はユーザーが選択した項目の番号 (int 型)です。 ただし、「×」でダイアログを閉じると JOptionPane.CLOSED_OPTION が返されます。

サンプルコード


ではサンプルコード。

import javax.swing.*;
import static javax.swing.JOptionPane.*;

JFrame parent = ...;

Object[] options = {"Java", "Groovy", "Scala", "Clojure", "Vistage"};
int resultIndex = JOptionPane.showOptionDialog(parent, "Here is a message.", "Option Dialog", 
                            DEFAULT_OPTION, QUESTION_MESSAGE, null, options, "Java");

if(resultIndex == CLOSED_OPTION) println "CLOSED";
else println options[resultIndex];

引数多いのでちょっと大変。 返り値は選択された項目の番号なので、選択されたオブジェクトを取得するためには、オプションに指定したオブジェクトの配列から対応する要素を取得する必要があります。


Groovy + SwingBuilder で Option Dialog を使うにはこんな感じ:

import groovy.swing.SwingBuilder

import static javax.swing.JOptionPane.*

def options = ['Java', 'Groovy', 'Scala', 'Clojure', 'Vistage']
def pane = new SwingBuilder().optionPane(
                    message:'Here is a message.',
                    messageType:QUESTION_MESSAGE,
                    options:options,
                    initialSelectionValue:'Java')
pane.createDialog(parent, 'Option Dialog').visible = true

def result = pane.value
println result

options に指定するものは Object の配列でなくリストでもいいようです。 また、この場合は value プロパティによって選択されたオブジェクトを直接取得することができます。 ダイアログを「×」で閉じると null が返されるようです。

Java Swing Hacks ―今日から使える驚きのGUIプログラミング集

Java Swing Hacks ―今日から使える驚きのGUIプログラミング集