標準ダイアログ設定

RunClientエンジンにて表示される メッセージダイアログ (項目チェックなど) について、 独自のダイアログクラスに変更する事が可能です。
クラス作成は、jp.ne.mki.wedge.run.interfaces.StandardDialog を実装するか、 jp.ne.mki.wedge.pub.client.dialog.DefaultStandardDialog を継承して作成することが可能です。
since:Version.1.1.3

実装が必要なメソッドの種類・詳細は jp.ne.mki.wedge.run.interfaces.StandardDialog の JavaDoc をご覧下さい。
このドキュメントでは ダイアログの色を任意に設定した 「カラフルダイアログ」クラスを作成しつつ 作成方法を説明いたします。

  1. クラスを作成
    今回は jp.ne.mki.wedge.pub.client.dialog.DefaultStandardDialog を継承してクラス作成します。
    package jp.ne.mki.wedge.sample.dialog;
    import jp.ne.mki.wedge.pub.client.dialog.DefaultStandardDialog;
    /**
     * カラフルダイアログ
     */
    public class ColorfulDialog extends DefaultStandardDialog{
    
    }
    

  2. showOptionDialogメソッドを上書き
    各種メソッドがありますが、これらのメソッドは showOptionDialog を最終的に実行しています。
    そのため、showOptionDialog を上書きして処理を組み込みます。
    今回は、ダイアログを ”カラフル”にするため背景色を設定したいので、ダイアログを表示する前に背景色を設定 するメソッドを追加します。 ※1
    import jp.ne.mki.wedge.pub.client.dialog.DefaultStandardDialog;
    /**
     * カラフルダイアログ
     */
    public class ColorfulDialog extends DefaultStandardDialog{
    
    public int showOptionDialog(
    	Component parentComponent,
    	Object message,
    	String title,
    	int optionType,
    	int messageType,
    	Icon icon,
    	Object[] options,
    	Object initialValue)
    	throws HeadlessException{
    
    	//ダイアログ生成
    	JOptionPane op = new JOptionPane(message, messageType, optionType, icon, options);
    	JDialog dlg = op.createDialog(parentComponent, title);
    	//ダイアログの装飾設定 ※1
    	setDialogProperty(dlg,messageType);
    	
    	dlg.setVisible(true);
    	dlg.dispose();
    
    	// 選択されたボタンを取得します。
    	Object selectedValue = op.getValue();
    	if (selectedValue == null) {
    		return JOptionPane.CLOSED_OPTION;
    	} else if (options == null) {
    		// Option Type が指定された場合(options の文字配列が指定されなかった場合)
    		// XXX_OPTION が Integer オブジェクトに格納して返されるので、整数に変換して返します。
    		if (selectedValue instanceof Integer) {
    			return ((Integer) selectedValue).intValue();
    		} else {
    			return JOptionPane.CLOSED_OPTION;
    		}
    	} else {
    		// options の文字配列が指定された場合、選択された項目のインデックスを返します。(0 origin)
    		int optionCount = options.length;
    		for (int ii = 0; ii < optionCount; ii++) {
    			if (selectedValue.equals(options[ii])) {
    				return ii;
    			}
    		}
    		return JOptionPane.CLOSED_OPTION;
    	}		
    }
    
    	/**
    	 * ダイアログに装飾を加える
    	 * @param dlg         ダイアログ
    	 * @param messageType メッセージタイプ
    	 */
    	protected void setDialogProperty(JDialog dlg,int messageType){
    	  ※2
    	}
    }
    

  3. setDialogPropertyの実装
    setDialogPropertyの実装を行います。 ※2
    今回の目的の カラフルなダイアログ にするため以下の記述を行います。
    setBackColorAll,setButtonBorderAll のメソッドは全ての子コンポーネントに対して処理を行うものとして作成します。
    //エラーの場合は 赤色系
    if(messageType == JOptionPane.ERROR_MESSAGE){
    	setBackColorAll(dlg, new Color(0xCC9999), new Color(0xCC0033));
    }
    //WARNINGの場合は 黄色系
    else if(messageType == JOptionPane.WARNING_MESSAGE){
    	setBackColorAll(dlg, new Color(0xFFFF66), new Color(0xFFCC66));
    }
    //その他の場合は 緑系
    else{
    	setBackColorAll(dlg, new Color(0x99CC99), new Color(0x669966));
    }
    
    //ボタンのBorderを変更
    CompoundBorder newBorder = new CompoundBorder(
    		new BevelBorder(BevelBorder.RAISED),
    		new BasicBorders.MarginBorder());
    
    setButtonBorderAll(dlg,newBorder);
    

  4. 作成クラスをRunClientのクラスパスに設定
    このように作成したクラス(全ソースをこのページの最後に記述します)を、コンパイルしクラスファイルを生成します。
    (コンパイル時には、wedge-run-client-1.4.0.jar,wedge-run-common-1.4.0.jar,wedge-common-1.4.0.jar,wedge-common-client-1.4.0.jar,wedge-optional-1.4.0.jar が必要です。)
    作成したクラスファイルを、RunClient起動時のクラスパスに設定します。
  5. Configファイルの設定
    RunClient.wdg(RunClient用設定ファイル) の 標準ダイアログ表示クラス の設定に作成したクラス名称を設定します。
    今回作成したクラスは jp.ne.mki.wedge.sample.dialog.ColorfulDialog なので以下の設定になります。
    <dialog>
    	<standard class="jp.ne.mki.wedge.sample.dialog.ColorfulDialog" />
    </dialog>

  6. RunClientを起動
    アプリを実行してメッセージダイアログを表示してみてください。
    ”カラフル”なダイアログが表示されましたか?
    正常に設定されていれば以下のようなダイアログが表示されます。
    ./image/dialogs.gif
補足補足
ColorfulDialog 完成ソース
package jp.ne.mki.wedge.sample.dialog;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.HeadlessException;

import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.plaf.basic.BasicBorders;

import jp.ne.mki.wedge.pub.client.dialog.DefaultStandardDialog;

/**
 * カラフルダイアログ
 * サンプル提供クラスです。
 * 
 */
public class ColorfulDialog extends DefaultStandardDialog{
	
/**
 * 指定されたアイコンを持つダイアログを表示します。
 * options パラメータが指定された場合、選択一覧は options に指定された値になります。
 * @param parentComponent ダイアログを表示する Frame を指定します。
 * @param message 表示する Object
 * @param title ダイアログのタイトル文字列
 * @param optionType ダイアログで選択可能なオプションを指示する整数。
 * @param messageType 主にプラグイン可能な Look & Feel のアイコンを指定するために使用されるメッセージの種類を表す整数。
 * @param icon ダイアログに表示するアイコン
 * @param options  ユーザが選択可能な項目を示すオブジェクトの配列。
 * @param initialValue ダイアログのデフォルト選択を示すオブジェクト。
 * @return ユーザが選択したオプションを示す整数。
 */
public int showOptionDialog(
	Component parentComponent,
	Object message,
	String title,
	int optionType,
	int messageType,
	Icon icon,
	Object[] options,
	Object initialValue)
	throws HeadlessException{
	
	//ダイアログ生成
	JOptionPane op = new JOptionPane(message, messageType, optionType, icon, options);
	JDialog dlg = op.createDialog(parentComponent, title);
	//ダイアログの装飾設定
	setDialogProperty(dlg,messageType);
	
	dlg.setVisible(true);
	dlg.dispose();

	// 選択されたボタンを取得します。
	Object selectedValue = op.getValue();
	if (selectedValue == null) {
		return JOptionPane.CLOSED_OPTION;
	} else if (options == null) {
		// Option Type が指定された場合(options の文字配列が指定されなかった場合)
		// XXX_OPTION が Integer オブジェクトに格納して返されるので、整数に変換して返します。
		if (selectedValue instanceof Integer) {
			return ((Integer) selectedValue).intValue();
		} else {
			return JOptionPane.CLOSED_OPTION;
		}
	} else {
		// options の文字配列が指定された場合、選択された項目のインデックスを返します。(0 origin)
		int optionCount = options.length;
		for (int ii = 0; ii < optionCount; ii++) {
			if (selectedValue.equals(options[ii])) {
				return ii;
			}
		}
		return JOptionPane.CLOSED_OPTION;
	}		
	
}

/**
 * ダイアログに装飾を加える
 * @param dlg         ダイアログ
 * @param messageType メッセージタイプ
 */
protected void setDialogProperty(JDialog dlg,int messageType){
	//背景色を変更
	//エラーの場合は 赤色系
	if(messageType == JOptionPane.ERROR_MESSAGE){
		setBackColorAll(dlg, new Color(0xCC9999), new Color(0xCC0033));
	}
	//WARNINGの場合は 黄色系
	else if(messageType == JOptionPane.WARNING_MESSAGE){
		setBackColorAll(dlg, new Color(0xFFFF66), new Color(0xFFCC66));
	}
	//その他の場合は 緑系
	else{
		setBackColorAll(dlg, new Color(0x99CC99), new Color(0x669966));
	}
	
	//ボタンのBorderを変更
	CompoundBorder newBorder = new CompoundBorder(
			new BevelBorder(BevelBorder.RAISED),
			new BasicBorders.MarginBorder());

	setButtonBorderAll(dlg,newBorder);
}

/**
 * 全てのコンポーネントに背景色設定
 * @param comp     設定対象となるContainer
 * @param color    ボタン以外の色
 * @param btnColor ボタンの色
 */
protected void setBackColorAll(Container comp,Color color,Color btnColor){
	int size = comp.getComponentCount();
	for(int i=0; i<size; i++){
		Component child = comp.getComponent(i);
		if(child instanceof AbstractButton){
			child.setBackground(btnColor);
		}
		else{
			child.setBackground(color);
		}
		
		if(child instanceof Container){
			setBackColorAll((Container)child, color, btnColor);
		}
	}
}

/**
 * 全てのボタンコンポーネントにBorder設定
 * @param comp     設定対象となるContainer
 * @param border    
 */
protected void setButtonBorderAll(Container comp,Border border){
	int size = comp.getComponentCount();
	for(int i=0; i<size; i++){
		Component child = comp.getComponent(i);
		if(child instanceof AbstractButton){
			((AbstractButton)child).setBorder(border);
		}
		else if(child instanceof Container){
			setButtonBorderAll((Container)child, border);
		}
	}
}
}