Adi*_*ith 6 java swing visibility swingworker
我有正在处理的银行gui应用程序,我的jdialog的setvisible方法似乎有问题.在用户撤回有效金额后,我弹出一个简单的对话框,其中显示"正在进行交易".在我的dobackground方法中,我继续轮询以检查是否已收到交易.我尝试使用swingworker,我不明白为什么它不起作用.如果我删除setvisible调用它工作正常,那么为什么setvisible导致系统挂起?这是我的jbutton mouselistener中的代码:
SwingWorker<String,Integer> worker = new SwingWorker<String,Integer>(){
JDialog waitForTrans = new JDialog((JFrame)null,true);
public String doInBackground() throws Exception {
waitForTrans.add(new JLabel("Updating balance in system. Please Wait..."));
waitForTrans.setMinimumSize(new Dimension(300,100));
waitForTrans.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
waitForTrans.setVisible(true);
Bank.getInstance().sendTransaction(currentPin,"-"+withdraw);
while(!Bank.getInstance().hasCompletedTransaction){
}
return null;
}
public void done(){
try {
this.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
waitForTrans.setVisible(false);
newField.setText(String.valueOf(Bank.getInstance().getAccountList().get(currentPin).getBalance()));
}
};
worker.execute();
Run Code Online (Sandbox Code Playgroud)
Jir*_*era 14
首先,建议在Swing Event-Dispatch线程中进行所有GUI更新,即使用SwingUtilites该类.
其次,你JDialog是模态的,因此阻塞setVisible(true)调用该方法的线程(在你的情况下是主线程,在下面的例子中是Swing Event-Dispatch Thread).
我没有说下面的代码是完美的,但它应该让你走上正轨......
final JDialog waitForTrans = new JDialog((JFrame) null, true);
SwingWorker worker = new SwingWorker() {
public String doInBackground() throws Exception {
Thread.sleep(5000);
return null;
}
public void done() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
waitForTrans.setVisible(false);
waitForTrans.dispose();
}
});
}
};
worker.execute();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
waitForTrans.add(new JLabel("Please Wait..."));
waitForTrans.setMinimumSize(new Dimension(300, 100));
waitForTrans.setVisible(true);
}
});
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
12504 次 |
| 最近记录: |