如何在不同的线程中使用JProgressBar?

时间:2016-02-01 08:26:18

标签: java multithreading swing jprogressbar

我在函数中使用POI来填充我的excel文档的内容(需要10秒),当我调用我的函数时,我想使用JProgressBar来查看进度,但是按钮和程序是块,我需要在其他线程中制作?我该怎么办?我的代码的一个例子:

<?php
include('db.php');
session_start();
$name=$_POST['name'];
$password=$_POST['password'];
echo $sql="SELECT * FROM register WHERE (name='$name' OR email='$name') AND password='$password'";
$result=mysqli_query($conn,$sql);
$num_rows = mysqli_num_rows($result);
if ($num_rows > 0)
 {
    $_SESSION['user']=mysqli_fetch_assoc($result);
    $row = $_SESSION['user'];
    $role = $row['role'];

            if($role == 1)
            {
                header('location:usermanagement.php');
            }
            else{
                header('location:user.php');
            }

}
else
 {

    echo "Wrong Username or Password";
    header('location:login.php');
}
$conn->close();
?>

2 个答案:

答案 0 :(得分:1)

事件侦听器在UI线程中执行。如果事件监听器需要很长时间,UI将停止工作/锁定/阻止/挂起。

我的猜测是方法generarDocumento()需要很长时间。如果您希望UI继续工作,则必须在工作线程中运行它。 Java文档包含几个示例:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

last example in the tutorial包含如何更新进度条的演示代码:https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemoProject/src/components/ProgressBarDemo.java

注意:链接的内容受版权保护;因此我不能在这里复制。

答案 1 :(得分:1)

尝试使用invokeLater,如下面的示例:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        generarDocumento(nombre);
    });