我在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()
??
答案 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()方法用适当的数据填充组件。