作者:梁祺 ([email protected])
来自:http://www.benisoft.net/day7/index.html
今天我们来看一下JFace提供的几个工具对话框。
- MessageDialog:显示出错信息,一般信息,警告信息,向用户提问,或者要求用户确认。
- MessageDialogWithToggle:同上,但是增加了一个Checkbox,允许用户选择是否将决定保存在Preference里。 这个我们在后面Preference一起介绍。
- InputDialog:提示用户输入一个值。
- ProgressMonitorDialog:显示长时间工作的进度。
MessageDialog
MessageDialog提供了一系列静态方法,弹出对话框用以显示出错信息,一般信息,警告信息,向用户提问, 或者要求用户确认。下面的代码演示了这五种对话框。
MessageDialog.openInformation(
window.getShell(),
"Day7",
"Hello, MessageDialog.openInformation");
MessageDialog.openWarning(
window.getShell(),
"Day7",
"Hello, MessageDialog.openWarning");
MessageDialog.openError(
window.getShell(),
"Day7",
"Hello, MessageDialog.openError");
boolean yes = MessageDialog.openQuestion(
window.getShell(),
"Day7",
"Hello! Are you MessageDialog.openQuestion?");
boolean ok = MessageDialog.openConfirm(
window.getShell(),
"Day7",
"Hello! Do you confirm to close MessageDialog.openConfirm?");
}
MessageDialog还有一个更加一般的方法open(),通过设置kind为
- MessageDialog.ERROR
- MessageDialog.INFORMATION
- MessageDialog.QUESTION
- MessageDialog.WARNING
- MessageDialog.CONFIRM
显示上述五种对话框。另外,使用MessageDialog.QUESTION_WITH_CANCEL,在QUESTION对话框可以多一个Cancel按钮。
String message, int style) {
InputDialog
Eclipse还提供了InputDialog,帮助用户输入一些简单的信息。例如我们的例子InputDialogAction, 需要用户输入一个正数,当输入非数字的字符时,它会提示”Requires a number“,并将OK按钮变灰。 通过这样的方式告诉用户输入错误,必须修正后才能继续。
InputDialog的构造函数的最后一个参数validator,它负责检查输入是否符合要求。
String dialogMessage, String initialValue, IInputValidator validator) {
在我们这个例子里,如果输入不符合要求(小于等于0的数字),isValid()方法返回出错信息的字符串; 输入符合要求就返回null,表示没有错误。InputDialog会根据isValid()是否返回null,来设置是否将OK按钮变灰。
InputDialog dialog = new InputDialog(window.getShell(), "Day7",
"Input a positive number.", "20", new IInputValidator() {
@Override
public String isValid(String newText) {
try {
int n = Integer.parseInt(newText);
if (n > 0) {
return null;
} else {
return "Requires positive number";
}
} catch (NumberFormatException e) {
return "Requires a number";
}
}
});
if (Window.OK == dialog.open()) {
MessageDialog.openInformation(window.getShell(), "Day7",
"The number is " + dialog.getValue());
}
}
ProgressMonitorDialog
ProgressMonitorDialog可以用来显示一个长时间工作的进度,以便用户了解该工作的进展。
使用ProgressMonitorDialog非常简单,首先创建一个ProgressMonitorDialog对象,然后调用它的run(...)方法, 这个方法由三个参数:
- fork:设置为true,使得工作在非UI线程里运行。
- cancelable:设置为true,使得用户可以取消这个长时间工作。
- runnable:IRunnableWithProgress对象,这个例子里,我们用了一个匿名类。
IRunnableWithProgress接口只有一个方法run(...),它接受参数IProgressMonitor对象, 我们通过和这个对象来控制进度条。
- IProgressMonitor.beginTask()方法用来启动一个任务,第一个参数是用于显示的任务名, 第二个参数是任务量,这个例子要睡十秒,所以我们设任务量为10。
- 接下来,每睡一秒,调用worked()方法来更新任务完成量1。
- 最后调用done()方法来告诉进度条任务全部完成。
这里有两个Exception需要关注一下。
- 如果在工作进行时有任何Exception需要终止, 需要将这个Exception封装在InvocationTargetException里抛出,这样整个工作就被终止了。外面的代码 捕获到InvocationTargetException,就知道任务出问题了,调用getCause()方法获得引起错误的异常。
- 当检测到用户按Cancel按钮取消整个工作时,就抛出InterruptedException,终止工作。
ProgressMonitorDialog dialog = new ProgressMonitorDialog(window.getShell());
try {
dialog.run( true, true, new IRunnableWithProgress(){
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
monitor.beginTask( "Sleep ...", 10);
for ( int i = 0; i < 10; i ++) {
if (monitor.isCanceled()) {
throw new InterruptedException();
}
Thread.sleep(1000);
monitor.worked(1);
}
monitor.done();
}});
MessageDialog.openInformation(window.getShell(), "Day7",
"10 seconds elapsed");
} catch (InvocationTargetException e) {
MessageDialog.openError(window.getShell(), "Day7",
"Exception: " + e.getMessage());
} catch (InterruptedException e) {
MessageDialog.openInformation(window.getShell(), "Day7",
"User cancels it.");
}
}
MessageDialog和ProgressMonitorDialog使用非常方便,我们因尽量使用这些工具对话框,避免自己编写类似的代码。