第七天:JFace对话框真的很好用

作者:梁祺 (eclipsesbs@gmail.com)

来自:http://www.benisoft.net/day7/index.html


今天我们来看一下JFace提供的几个工具对话框。

  • MessageDialog:显示出错信息,一般信息,警告信息,向用户提问,或者要求用户确认。
  • MessageDialogWithToggle:同上,但是增加了一个Checkbox,允许用户选择是否将决定保存在Preference里。这个我们在后面Preference一起介绍。
  • InputDialog:提示用户输入一个值。
  • ProgressMonitorDialog:显示长时间工作的进度。
MessageDialog

MessageDialog提供了一系列静态方法,弹出对话框用以显示出错信息,一般信息,警告信息,向用户提问,或者要求用户确认。下面的代码演示了这五种对话框。

     public void run(IAction action) {
        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按钮。
     public static boolean open( int kind, Shell parent, String title,
            String message,  int style) {
InputDialog

Eclipse还提供了InputDialog,帮助用户输入一些简单的信息。例如我们的例子InputDialogAction,需要用户输入一个正数,当输入非数字的字符时,它会提示”Requires a number“,并将OK按钮变灰。通过这样的方式告诉用户输入错误,必须修正后才能继续。

InputDialog的构造函数的最后一个参数validator,它负责检查输入是否符合要求。

     public InputDialog(Shell parentShell, String dialogTitle,
            String dialogMessage, String initialValue, IInputValidator validator) {

在我们这个例子里,如果输入不符合要求(小于等于0的数字),isValid()方法返回出错信息的字符串;输入符合要求就返回null,表示没有错误。InputDialog会根据isValid()是否返回null,来设置是否将OK按钮变灰。

     public void run(IAction action) {
        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,终止工作。
     public void run(IAction action) {
        
        ProgressMonitorDialog dialog =  new ProgressMonitorDialog(window.getShell());
         try {
            dialog.run( truetruenew 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使用非常方便,我们因尽量使用这些工具对话框,避免自己编写类似的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值