如何在不同的线程中使用 JProgressBar?
How to use a JProgressBar in a different Thread?
我在一个函数中使用 POI 来填充我的 excel 文档的内容(这需要 10 秒),当我调用我的函数时,我想使用 JProgressBar 来查看进度,但是按钮和程序是块,我需要在其他线程中制作?我该怎么做?我的代码示例:
btnEjecutar.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
//the function
generarDocumento(nombre);
}
事件侦听器在UI 线程中执行。如果事件侦听器需要很长时间,UI 将停止 working/lock up/block/hang.
我的猜测是 generarDocumento()
方法需要很长时间。如果您希望 UI 继续工作,您必须 运行 它在工作线程中。 Java 文档包含几个如何执行此操作的示例:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
last example in the tutorial contains demo code how to update a progress bar: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java
注意:链接内容受版权保护;所以我不能在这里复制它。
尝试使用 invokeLater,如下例所示:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
generarDocumento(nombre);
});
我在一个函数中使用 POI 来填充我的 excel 文档的内容(这需要 10 秒),当我调用我的函数时,我想使用 JProgressBar 来查看进度,但是按钮和程序是块,我需要在其他线程中制作?我该怎么做?我的代码示例:
btnEjecutar.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
//the function
generarDocumento(nombre);
}
事件侦听器在UI 线程中执行。如果事件侦听器需要很长时间,UI 将停止 working/lock up/block/hang.
我的猜测是 generarDocumento()
方法需要很长时间。如果您希望 UI 继续工作,您必须 运行 它在工作线程中。 Java 文档包含几个如何执行此操作的示例:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
last example in the tutorial contains demo code how to update a progress bar: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java
注意:链接内容受版权保护;所以我不能在这里复制它。
尝试使用 invokeLater,如下例所示:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
generarDocumento(nombre);
});