倭マン's BLOG

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

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

今回は Input Dialog。 Input Dialog はユーザーに「文字列の入力」もしくは「項目の選択」を求めるダイアログです。

Input Dialog


Input Dialog を表示させるには javax.swing.JOptionPane の static メソッド showInputDialog() メソッドを使用します。 このメソッドのシグニチャはこんな感じ:
static String showInputDialog(Object message) 
static String showInputDialog(Object message, Object initialSelectionValue) 

static String showInputDialog(Component parent, Object message) 
static String showInputDialog(Component parent, Object message, Object initialSelectionValue) 
static String showInputDialog(Component parent, Object message, String title, int messageType) 
static Object showInputDialog(Component parent, Object message, String title, int messageType,
                                          Icon icon, Object[] selectionValues, Object initialSelectionValue) 

1番目、2番目は親コンポーネントを指定しないものです。 それぞれ3番目、4番目で parent に null を指定したものと同じかと。 以下では省略。 引数の詳細はこんな感じ:

引数 型 必須 デフォルト値 説明
parent java.awt.Component No null 親となる GUI コンポーネント
message Object Yes - メッセージ
title String No "入力" ダイアログのタイトル
messageType int No JOptionPane.
QUESTION_MESSAGE
メッセージ・タイプ
icon javax.swing.Icon No アイコン
selectionValues Object[] No 選択可能な項目
initialSelectionValue Object No selectionValues[0] 初期に選択される項目

messageType に関しては以前の記事参照。

サンプルコード


ではサンプルコード。 次の2つに分けて見ていきます:
  • 文字列を入力するダイアログ
  • 項目を選択するダイアログ

文字列を入力するダイアログ

まずは文字列を入力するダイアログ。
import javax.swing.*;
import static javax.swing.JOptionPane.*;

JFrame parent = ...;

// 下図 上
result = JOptionPane.showInputDialog(parent, "Here is a message.");

// 下図 中
result = JOptionPane.showInputDialog(parent, "Here is a message.", "Initial Selection Value");

// 下図 下
result = JOptionPane.showInputDialog(parent, "Here is a message.", "Input Dialog", INFORMATION_MESSAGE);


同様のダイアログを Groovy + SwingBuilder を使って表示させてみましょう。 上図一番下のダイアログを表示させるには下記のようにします(初期値の文字列も指定しています):
import groovy.swing.SwingBuilder
import static javax.swing.JOptionPane.*

JFrame parent = ...

def pane = new SwingBuilder().optionPane(
                            message:'Here is a message.',
                            messageType:INFORMATION_MESSAGE,
                            optionType:OK_CANCEL_OPTION,
                            wantsInput:true,
                            initialSelectionValue:'Initial Selection Value')
pane.createDialog(parent, 'Input Dialog').visible = true

def result = pane.inputValue

入力された値の取得するには inputValue プロパティを読み取ります。 「了解」、「取消し」、「×」のいずれの操作がされたかは前回と同じく value プロパティによって取得します。

項目を選択するダイアログ

次は項目を選択するダイアログ。 この記事最初に載せた showInputDialog() メソッドのうち、一番下のものを使います。
import javax.swing.*;
import static javax.swing.JOptionPane.*;

JFrame parent = ...;

Object[] selectionValues = {"Java", "Groovy", "Scala", "Clojure", "Vistage"};
Object result = JOptionPane.showInputDialog(parent, "Here is a message.", "Input Dialog",
                                INFORMATION_MESSAGE, null, selectionValues, "Java");

Java での Object の配列の作成ってこんなんであってたっけ? まぁ、ともかく実行結果はこんな感じ:


Groovy + SwingBuilder で書くと以下のようになります:
import groovy.swing.SwingBuilder
import static javax.swing.JOptionPane.*

JFrame parent = ...

def items = ['Java', 'Groovy', 'Scala', 'Clojure', 'Vistage']
def pane = new SwingBuilder().optionPane(
                            message:'Here is a message.',
                            messageType:INFORMATION_MESSAGE,
                            optionType:OK_CANCEL_OPTION,
                            selectionValues:items,
                            initialSelectionValue:'Java')
pane.createDialog(parent, 'Input Dialog').visible = true

def result = pane.inputValue

選択された値の取得方法は「文字列を入力するダイアログ」の場合と同じです。

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

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