1

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

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()??

4

2 回答 2

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

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

于 2012-04-07T10:46:49.300 回答
0

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

于 2012-04-07T10:34:24.137 回答