Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NetBeans RCP-当应用程序运行且可见时如何显示对话框_Java_Dialog_Rcp_Netbeans Platform - Fatal编程技术网

Java NetBeans RCP-当应用程序运行且可见时如何显示对话框

Java NetBeans RCP-当应用程序运行且可见时如何显示对话框,java,dialog,rcp,netbeans-platform,Java,Dialog,Rcp,Netbeans Platform,我正在NetBeans框架(RCP)上开发一个Java应用程序。当应用程序运行且可见时,我想显示一个“请稍候”对话框,该对话框将禁用用户使用GUI,直到正在运行的线程完成。请看下面我的代码。它现在的工作方式是,在应用程序可见之前显示“请稍候”对话框。再一次,我想在应用程序可见时显示“请等待”对话框,而不是之前。我该怎么做 public final class MyTopComponent extends TopComponent { public CoreTopComponent()

我正在NetBeans框架(RCP)上开发一个Java应用程序。当应用程序运行且可见时,我想显示一个“请稍候”对话框,该对话框将禁用用户使用GUI,直到正在运行的线程完成。请看下面我的代码。它现在的工作方式是,在应用程序可见之前显示“请稍候”对话框。再一次,我想在应用程序可见时显示“请等待”对话框,而不是之前。我该怎么做

public final class MyTopComponent extends TopComponent {

    public CoreTopComponent() {
        initComponents();
    }

    @Override
    public void componentOpened() {

            //Show a Dialog ontop of the application with a Please Wait message so that the user cannot use the application until the following threads
            //are complete. The Dialog is supposed to automatically close once the threads are complete.

            JOptionPane.showOptionDialog(this, "Please Wait...",
            "Please Wait...", JOptionPane.PLAIN_MESSAGE,
            JOptionPane.PLAIN_MESSAGE, null, new Object[] {},
            null);


            //There are 10 threads like the following 2 that perform something and in the end update the GUI

            final Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    //Step 1 - Create class that initializes configuration

                    //Step 2 - Create class that performs something using configuration

                    //Step 3 - Update GUI on the EDT using SwingUtilities.invokeLater
                }
            });
            t1.start();

            final Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    //Step 1 - Create class that initializes configuration

                    //Step 2 - Create class that performs something using configuration

                    //Step 3 - Update GUI on the EDT using SwingUtilities.invokeLater
                }
            });
            t2.start(); 
    }


    @Override
    public void componentClosed() {

    }

    void writeProperties(java.util.Properties p) {
        // better to version settings since initial version as advocated at
        // http://wiki.apidesign.org/wiki/PropertyFiles
        p.setProperty("version", "1.0");
        // TODO store your settings
    }

    void readProperties(java.util.Properties p) {
        String version = p.getProperty("version");
        // TODO read your settings according to their version
    }
}
我尝试使用以下方法,但仍然发生同样的情况:

@Override
public void componentShowing() {
    JOptionPane.showOptionDialog(this, "Please Wait...",
            "Please Wait...", JOptionPane.PLAIN_MESSAGE,
            JOptionPane.PLAIN_MESSAGE, null, new Object[]{},
            null);
}

JOptionPane创建模态JDialogs。为了避免这种情况,可以通过创建线程使其成为非模态:

    Thread waitThread = new Thread(new Runnable(){
        public void run(){
            JOptionPane.showOptionDialog(rootPane, "Please Wait...",
                "Please Wait...", JOptionPane.PLAIN_MESSAGE,
                JOptionPane.PLAIN_MESSAGE, null, new Object[] {},
                null);
    }
请致电:

waitThread.start();
请注意,我将父组件更改为
rootPane
,而不是
null
,但您可以根据应用程序的需要执行此操作。这将解决您的问题,并允许在对话框启动时运行其余代码

确保在其他线程之前调用它,以便它们可以在该对话框启动时运行

这里有一个类似的问题:

您可以使用.showProgressDialogAndRun()方法系列在UI的中心显示进度条,该进度条将阻止UI,直到任务完成

实现该接口将使您的任务能够访问。然后,使用
showProgressDialogAndRun(ProgressRunnable操作、字符串显示名称、布尔包含的细节标签)
方法,您可以为需要运行的每个子任务设置细节标签

下面是一个片段,展示了实现这一点的不同方法。此场景中的主要任务是“运行启动”任务。它驱动所有子任务,将ProgressHandle传递给每个子任务,以便每个子任务都可以设置详细信息标签:

    ...
    final List<ProgressRunnable> tasks = new ArrayList<ProgressRunnable>();
    tasks.add(new ProgressRunnable<Object>() {
        @Override
        public Object run(ProgressHandle ph) {
            ph.progress("Work unit 1", 1);
            return null;
        }
    });
    tasks.add(new CancellableTask());
    ProgressUtils.showProgressDialogAndRun(new ProgressRunnable<Void>() {
        @Override
        public Void run(ProgressHandle ph) {
            // run all tasks passing in the ProgressHandle to each
            for (ProgressRunnable task : tasks) {
                task.run(ph);
            }
            return null;
        }
    }, "Running Startup", true);
    ...
    // will show a Cancel button on the progress UI
    private class CancellableTask implements ProgressRunnable<Object>, Cancellable {

    @Override
    public Object run(ProgressHandle ph) {
        ph.progress("Cancellable work unit", 2);
        return null;
    }

    @Override
    public boolean cancel() {
        // clean up 
        return true;
    }
}
。。。
最终列表任务=新建ArrayList();
tasks.add(新的ProgressRunnable(){
@凌驾
公共对象运行(ProgressHandle ph){
博士进展(“工作单元1”,1);
返回null;
}
});
添加(新的CancelableTask());
ProgressUtils.showProgressDialogAndRun(新的ProgressRunnable(){
@凌驾
公共无效运行(ProgressHandle ph){
//运行将ProgressHandle传递给每个
for(ProgressRunnable任务:任务){
任务运行(ph);
}
返回null;
}
},“正在运行的启动”,正确);
...
//将在进度UI上显示取消按钮
私有类CancelableTask实现ProgressRunnable、Cancelable{
@凌驾
公共对象运行(ProgressHandle ph){
ph.progress(“可撤销工作单元”,2);
返回null;
}
@凌驾
公共布尔取消(){
//清理
返回true;
}
}

我现在很困惑。我认为任何GUI更改都应该在EDT上执行,并且我认为显示对话框也是GUI更改。您编写的示例显示了来自另一个后台线程的对话框,而不是EDT?您的示例是否也允许应用程序可见?@jadrijan是的,这是事实,最好在EDT上运行swing。但是,如果在EDT上运行此对话框,由于它是线性运行的,它会停止在EDT中运行的任何其他内容的运行。如果加载线程未在EDT中运行,则在使帧可见后,只需调用
JOptionPane.showOptionDialog()
。但是,这可能对您的代码不方便。有关EDT的更多信息,我想不出任何其他涉及到
JOptionPane
的解决方案。可能需要自定义弹出窗口非常感谢您的帮助没问题。我希望这对您来说是一个可行的解决方案。您可以使用ProgressUtils.showProgressDialogAndRun()方法族来实现这一点—显示进度条并阻止UI,直到任务完成。(对不起,现在没有时间补充答案)非常感谢,我想这正是我想要的。不客气,祝你好运。我会在这个周末加上这个评论作为回答,如果没有人比我强的话,请这么做。我刚试过你的建议,效果很好,非常感谢。我还有两个问题。如何更改进度对话框的大小使其更大?是否可以为多个可运行程序显示一个进度对话框,正如我在上面的示例中创建的新线程中所显示的那样?谢谢你,所以我添加了我的评论作为答案,并试图回答你的其他问题。我知道没有办法改变进度对话框的大小。