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

时间:2012-04-07 10:25:30

标签: 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. . .");
    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称为:

new AnimatedProgress(this, true, dataTable).setVisible(True);

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

如何首先显示JDialog,然后处理方法:getTableData()processData() ??

2 个答案:

答案 0 :(得分:4)

以下是SwingWorker的使用示例:

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();
}

我没有测试过,但我希望它有效。

答案 1 :(得分:0)

JDialog在创建之前无法显示==&gt;在可见性改变之前,必须完全执行构造函数 我认为你应该创建一个包含数据填充的myInitialize()方法。 首先,通过现在调用构造函数使对话框可见,之后可以调用myIntialize()方法用适当的数据填充组件。