为什么这个不确定的 jProgressBar 在这个简单的代码中不起作用?
Why this indeterminate jProgressBar don't work in this simple code?
我想在 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.setIndeterminate(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 事件线程上调用它,所以应该 never完成后,您将锁定渲染 GUI 的线程。解决方案很简单——不要在 Swing 事件线程上执行此类操作,而是在后台线程中执行此类操作,例如在 SwingWorker 的 doInBackground 方法中调用它。请查看 Lesson: Concurrency in Swing 了解更多信息。
我想在 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.setIndeterminate(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 事件线程上调用它,所以应该 never完成后,您将锁定渲染 GUI 的线程。解决方案很简单——不要在 Swing 事件线程上执行此类操作,而是在后台线程中执行此类操作,例如在 SwingWorker 的 doInBackground 方法中调用它。请查看 Lesson: Concurrency in Swing 了解更多信息。