Java 在处理数据之前强制JDialog可见?

Java 在处理数据之前强制JDialog可见?,java,swing,jdialog,swingworker,Java,Swing,Jdialog,Swingworker,我在NetBeans中创建了一个JDialog和一个自定义构造函数,如下所示: public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) { super(parent, modal); initComponents(); setLocationRelativeTo(parent); progressLabel.setText("Collecting Table Data.

我在NetBeans中创建了一个JDialog和一个自定义构造函数,如下所示:

public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table) {
    super(parent, modal);
    initComponents();
    setLocationRelativeTo(parent);
    progressLabel.setText("Collecting Table Data. . .");
    Object[][] data = getJTableData(table); // Simple method to collect data and store in Object[][] array
    progressLabel.setText("Processing Data. . .");
    processData(data);
    progressLabel.setText("Data Processed. . .");
}
现在我把这个JDialog称为:

我的问题是,当Java调用构造函数时,构造函数中的所有代码都会首先执行,然后出现带有最终结果的对话框


如何使我的JDialog首先显示,然后处理方法:getTableData和processData???

JDialog在创建之前不可见==>在可见性更改之前必须完全执行构造函数。 我认为您应该创建一个包含数据填充的myInitialize方法。
首先,通过调用构造函数使对话框可见,之后可以调用MyInitialize方法,用适当的数据填充组件。

JDialog在创建之前不可见==>在可见性更改之前,必须完全执行构造函数。 我认为您应该创建一个包含数据填充的myInitialize方法。 首先,通过调用构造函数使对话框可见,然后可以调用MyInitialize方法,用适当的数据填充组件。

以下是SwingWorker的示例用法:

我没有测试它,但我希望它能工作。

以下是SwingWorker的一个示例使用:



我没有测试它,但我希望它能工作。

不要阻止EDT事件调度线程-发生这种情况时,GUI将“冻结”。不要调用Thread.sleepn,而是为重复任务实现一个Swing计时器,或为长时间运行的任务实现一个SwingWorker。有关详细信息,请参阅。@AndrewThompson-是的,这实际上是主要问题。我很了解swing.Timer,但只有两个过程绝对不会重复,而且,我不知道如何在这里应用SwingWorker。你能用SwingWorker代码回答这个问题吗?@Asif:请不要问代码-这取决于你自己创建代码。为什么不看看Andrew Thompson链接的教程,并尝试创建自己的代码呢。如果你在这里尝试后被卡住了。好的,我会努力的。谢谢:@Andrew Thompson是对的。最好的解决方案是使用SwingWorker。请参阅我的答案,其中显示了一个使用SwingWorker的示例。不要阻止EDT事件调度线程-发生这种情况时,GUI将“冻结”。不要调用Thread.sleepn,而是为重复任务实现一个Swing计时器,或为长时间运行的任务实现一个SwingWorker。有关详细信息,请参阅。@AndrewThompson-是的,这实际上是主要问题。我很了解swing.Timer,但只有两个过程绝对不会重复,而且,我不知道如何在这里应用SwingWorker。你能用SwingWorker代码回答这个问题吗?@Asif:请不要问代码-这取决于你自己创建代码。为什么不看看Andrew Thompson链接的教程,并尝试创建自己的代码呢。如果你在这里尝试后被卡住了。好的,我会努力的。谢谢:@Andrew Thompson是对的。最好的解决方案是使用SwingWorker。请参阅我的答案,其中显示了使用SwingWorker.com的示例,以及我应该在何处调用此myInitialize方法?在构造函数调用之后。AnimatedProgress=newanimatedprogressthis,true,dataTable;progress.setVisibletrue;progress.init;实际上,getTableData和processData方法中的全部代码都是与此JDailog中的动画一起自执行的,不过我在这里跳过了计时器代码,并且我无法通过调用JDialog的事件调用此代码……我希望我能清楚地告诉您:在构造函数调用之后,我应该在哪里调用此myInitialize方法。AnimatedProgress=newanimatedprogressthis,true,dataTable;progress.setVisibletrue;progress.init;实际上,getTableData和processData方法中的全部代码都是与此JDailog中的动画一起自执行的,但是我在这里跳过了计时器代码,我不能通过调用JDialog的事件调用此代码……我希望我对您说得很清楚:哦,非常感谢,我只需要您给出的结构代码:如果出现任何错误,我将处理这些错误..:@Asif如果getJTableData或processData包含GUI上的任何更改,请尝试在process方法中传输它,只是为了避免GUI冻结。我在声明process method时出错:method不会重写或实现超类型名称冲突中的方法:BackgroundThread中的processjava.util.List和javax.swing.SwingWorker中的processjava.util.List具有相同的擦除,但是两个都没有覆盖另一个在编辑行时:class BackgroundThread扩展SwingWorker到class BackgroundThread扩展SwingWorker错误消除了,这里发生了什么?我已经成功地执行了所有步骤,只剩下最后一个步骤,在所有处理之后,我必须自动处理对话框,我如何才能实现这一点?或者有没有办法通过我的后台线程告诉EDT是的,我已经完成了我的过程,现在你可以调用dispose?哦,非常感谢,我只需要你给出的结构代码:如果
纽约发生@Asif如果getJTableData或processData包含GUI上的任何更改,请尝试在process方法中传输它,只是为了避免GUI冻结。我在声明process method时出错:method不会重写或实现超类型名称冲突中的方法:BackgroundThread中的processjava.util.List和javax.swing.SwingWorker中的processjava.util.List具有相同的擦除,但是两个都没有覆盖另一个在编辑行时:class BackgroundThread扩展SwingWorker到class BackgroundThread扩展SwingWorker错误消除了,这里发生了什么?我已经成功地执行了所有步骤,只剩下最后一个步骤,在所有处理之后,我必须自动处理对话框,我如何才能实现这一点?或者有没有办法通过我的背景线程告诉EDT我已经完成了我的过程,现在你可以调用dispose?
new AnimatedProgress(this, true, dataTable).setVisible(True);
public class BackgroundThread extends SwingWorker<Void, Void>
{
    private JTable table;

    public BackgroundThread(JTable table)
    {
        this.table = table;
    }

    @Override
    public Void doInBackground() throws Exception
    {
        /*
            If getJTableData() or processData() are not static,
            pass a reference of your class which has these methods
            and call them via that reference
        */
        Object[][] data = getJTableData(table);
        publish("Processing Data. . .");
        processData(data);
        publish("Data Processed. . .");
        return null;
    }

    @Override
    public void process(List<String> chunks)
    {
        for(String chunk : chunks) progressLabel.setText(chunk);
    }
}
public AnimatedProgress(java.awt.Frame parent, boolean modal, JTable table)
{
    super(parent, modal);
    initComponents();
    setLocationRelativeTo(parent);
    setVisible(true);
    new BackgroundThread(table).execute();
}