java - 为什么这个不确定的 jProgressBar 在这个简单的代码中不起作用?

标签 java swing concurrency process jprogressbar

我想在 JForm 上使用不确定的 jProgressBar 但我不知道为什么在我的代码中不起作用。 jProgressBar 必须处于不确定状态,直到线程收到 latch.await() 信号。这是我按下按钮时代码的简单部分:

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    jProgressBar1.setVisible(true);
    jProgressBar1.setIndeterminate(true);

    inizio.sbuff.setLength(0);
    inizio.latch.reset();
    OutputStream outStream = inizio.p.getOutputStream();
    PrintWriter pWriter = new PrintWriter(outStream);
    pWriter.println("17");
    pWriter.flush();

    try {
        inizio.latch.await();
    } catch (InterruptedException ex) {
        Logger.getLogger(menu.class.getName()).log(Level.SEVERE, null, ex);
    }

    new risultati().setVisible(true);



     jProgressBar1.setIndeterminate(false);

    //jProgressBar1.setVisible(false);
    //this.setEnabled(false);
}

jProgressBar 在信号到达之前不会激活。如果我删除 jProgressBar1.setIndependent(false); jProgressBar 将在倒计时信号到达之后而不是之前激活。 这是我倒计时时的代码部分:

p = Runtime.getRuntime().exec("testpad -i -c"+can+" -n"+pad+" "+pathFile);
            final InputStream inStream = p.getInputStream();

            Thread uiThread = new Thread("UIHandler") {
                @Override
                public void run() {
                  InputStreamReader reader = new InputStreamReader(inStream);
                  Scanner scan = new Scanner(reader);
                  prec=null;

                  while (scan.hasNextLine()) {

                    prec=scan.nextLine();
                    System.out.println(prec);
                    sbuff.append(prec);
                    sbuff.append('\n');

                    if(err.equals(prec)){
                        //flag[0] = 1;
                        bandiera = 1;
                        //latch.countDown();
                    }

                    if(prec.contains("Quit")){
                        //System.out.println("STO DENTRO "+prec);
                        latch.countDown();
                    }

                  }

               }
            };
            uiThread.start();

我可以在倒计时信号到来时首先激活jProgressBar吗?谢谢。

最佳答案

您的 latch 变量是 CountDownLatch 还是 CyclicBarrier?如果是这样,或者如果它是类似的构造,则调用 await() 是一个阻塞调用,并且由于您在 Swing 事件线程上调用此调用,这是永远不应该执行的操作,因此您将锁定呈现 GUI 卡住的线程。解决方案很简单——不要在 Swing 事件线程中执行此类操作,而是在后台线程中执行此类操作,例如在 SwingWorker 的 doInBackground 方法中调用它。请查看Lesson: Concurrency in Swing了解更多相关信息。

关于java - 为什么这个不确定的 jProgressBar 在这个简单的代码中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30845300/

相关文章:

java - 错误 : No suitable driver found for jdbc:mysql://localhost:3306/test

具有内部类的 Java GUI 操作监听器

java - 通过不同的方法更改可运行对象中的 AtomicBoolean 值

java - 正确使用MVC模式说明

java - Hibernate JPA find() 和 merge() 之间删除的区别

java - JLabel 和 JTextField setText 未更新

java - JTabbedPane FlowLayout 抛出 ArrayIndexOutOfBoundsException

java - Grails - 与第 3 方 API 的异步通信

go - 为什么存在 sync.Mutex?

java - 如果 XML 文件太大,如何中止请求?