我在函数中使用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();
?>
答案 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);
});