java swing挂起系统中的setvisible方法

我正在使用银行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();

回答:

首先,建议在Swing Event-Dispatch线程中进行所有GUI更新,即使用SwingUtilites类。

其次,您JDialog是模态的,因此阻塞了setVisible(true)调用该方法的线程(在您的情况下为Main线程,在以下情况下为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);

}

});

希望这可以帮助。

以上是 java swing挂起系统中的setvisible方法 的全部内容, 来源链接: utcz.com/qa/412832.html

回到顶部