当前位置: 首页 > 面试题库 >

java swing挂起系统中的setvisible方法

燕涵容
2023-03-14
问题内容

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

希望这可以帮助。



 类似资料:
  • 问题内容: 当我尝试通过发出命令“ g ++ qr.cpp -o qr”来编译此文件时,系统挂起。我在其他任何地方都没有看到这种错误。 我的编译器版本信息如下。 问题答案: 你知道这些有多大吗? 每个至少1GB !!!您将要动态分配它们…

  • 问题内容: 我正在研究需要检测系统关闭的应用程序。但是,我没有找到任何可靠的方式来接收此事件的通知。 我知道在关机时,我的应用会收到一个信号,然后是。我想知道是否有任何方法可以查询a 是否 为关机序列的一部分 ? 有谁知道是否有一种以编程方式查询(C API)的方法吗? 据我所知,系统没有提供任何其他方法来查询即将发生的关机。如果确实如此,那也将解决我的问题。我也一直在尝试,但是更改似乎是瞬时的,

  • 不确定是否有人遇到过这个问题。我正在使用带有EJB3.1的JBoss7.1应用程序服务器和带有HiberNate实现的JPA2.0。我正在使用后端Oracle 11g数据库。请参阅下面的代码。我正在使用由HTTP GET请求驱动的servlet调用我的EJB。 当我在下面的代码中注释掉 时,我的网页会永远挂起,一段时间后我会得到下面的堆栈跟踪(如果我调试,它会让我直到 persist() 方法,然

  • Momenta 系统研发工程师 一面挂 8.22 大概50min 简历上把ROS小车集群项目放在了第一个,一下子就收到了面试官在面试开始之前的口头关照(等下重点介绍一下) 一、项目介绍 大致介绍一下小车项目,负责的模块 舵机控制是闭环还是开环? 项目和论文有什么关系吗? 再简单介绍一下其他两个项目的其中一个? 二、手撕 一个ros node上的按照固定频率发布一个topic 1(整形变量),同时监

  • 我有两个类:类jDialog和JFrame 知道如何保持jDialog运行吗?我只使用setVisible()来隐藏它,而不使用dispose();

  • 本文向大家介绍linux通过挂载系统光盘搭建本地yum仓库的方法,包括了linux通过挂载系统光盘搭建本地yum仓库的方法的使用技巧和注意事项,需要的朋友参考一下 1.挂载光盘   /dev下的cdrom目录是事先创建好的 2.修改yum配置文件(文件位置:/etc/yum.repos.d) 保存退出 3.验证 我们使用 yum 命令加上 list 参数就可以查看仓库 以上所述是小编给大家介绍的l