- PR -

SWTでのモーダルダイアログの表示の際に処理を止める方法

1
投稿者投稿内容
チャロ
会議室デビュー日: 2004/05/20
投稿数: 9
投稿日時: 2005-06-26 23:18
現在SWTを使ったソフトを作っているのですが、
モーダルダイアル後を表示する部分で以下のようなコードを書いたのですが
dialog.open()で処理は止まりません。

Shell dialog = new Shell(parentShell, SWT.DIALOG_TRIM
| SWT.SYSTEM_MODAL); // SWT.APPLICATION_MODALなどにしても結果は同じ
コントロール追加などの処理。
dialog.open();

return returnValue;

ダイアログないのイベントで returnValueに値を設定しているので
ダイアログが閉じてから、 return を実行しなければまずいのです。
どうしようかと思い、dialog.open()の後に、

while (!dialog.isDisposed()) {
if (!dialog.getDisplay().readAndDispatch()) {
dialog.getDisplay().sleep();
}
}
というようにメッセージループを作り、処理を止めたのですが
この方法で問題はないのでしょうか。

ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-06-27 03:18
>というようにメッセージループを作り、処理を止めたのですが
>この方法で問題はないのでしょうか。

問題ないです。処理を戻さない場合は通常そのようにするはずです。

少々趣が違いますが、Dialogクラスを継承したダイアログを作成し、
openメソッドで値を返す場合、次のようにします。openメソッドで
メッセージループを回しているのが判ると思います。

コード:
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class ModalDialog extends Dialog {
	private Shell shell;

	public ModalDialog(Shell parent, int style) {
		super(parent, style);
	}

	public ModalDialog(Shell parent) {
		this(parent, SWT.NONE);
	}

	public int open() {
		createContents();
		shell.open();
		shell.layout();
		Display display = getParent().getDisplay();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		return SWT.OK;
	}

	private void createContents() {
		shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
		shell.setSize(500, 375);
		shell.setText("SWT Dialog");
		//
	}
	
	/** 動作確認。ModalDialogを開き、閉じたときの終了コードを確認 */
	public static void main(String[] args) {
		Shell shell = new Shell();
		ModalDialog md = new ModalDialog(shell);
		int result = md.open();
		System.out.println("result=" + ((result==SWT.OK)?"SWT.OK":"?" + result));
	}
}


チャロ
会議室デビュー日: 2004/05/20
投稿数: 9
投稿日時: 2005-06-27 13:32
大変参考になりました。ありがとうございます。

1

スキルアップ/キャリアアップ(JOB@IT)