java - java swing中的setvisible方法挂起系统

标签 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();

最佳答案

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

其次,您的 JDialog 是模态的,因此会阻塞调用 setVisible(true) 方法的线程(在您的例子中是主线程,在下面的例子中Swing 事件调度线程)。

我并不是说下面的代码是完美的,但它应该会让你走上正轨......


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 - java swing中的setvisible方法挂起系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413310/

相关文章:

java - START_STICKY 服务是否在应用程序自行终止后重新启动

java - JToolBar始终 float

JAVA - 帮助在扩展 Canvas 上绘图

php - 在 PHP 中从父类调用子方法

java - 在这种情况下,业务代表和服务定位器应该驻留在哪里才能不产生循环依赖?

java - 规范化数据库有哪些优点?

java - JList 填充了不显示任何内容的 vector

css - FBML,连接可见,否则,额外的空白

android - 我的应用程序的键盘永久可见

Java 样板 if 语句