`
eclipsesbs
  • 浏览: 19781 次
社区版块
存档分类
最新评论

第七天: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使用非常方便,我们因尽量使用这些工具对话框,避免自己编写类似的代码。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics