【发布时间】:2011-09-25 07:56:19
【问题描述】:
在我的 Java GUI 应用程序中,我有一个 JButton,当单击它时,它会调用 function 来连接到 database,然后在 DB 中调用 function 到 clear table ,然后调用从一个文件中读取文本的function并加载variables,它调用从另一个文件中读取文本的function,比较两者中的data,然后调用function与@987654333中的任何一个@ 或 insert 数据库中的数据,所有这些都可以正常工作。
但是我的问题与JButton 相关,当它被点击时我想运行Indeterminate progress bar 只是为了让用户知道工作正在完成,然后在它离开action listener setIndeterminate to false 之前设置值progress bar 到 100(complete),但在我的情况下,当您单击 button 时,它会保持单击状态,而 progress bar 会冻结。
我应该采取什么措施来防止这种情况发生?线程可能?但我对java中的线程很陌生。这是我的动作监听器:
private class buttonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if( e.getSource() == genButton )
{
progressBar.setIndeterminate(true);
progressBar.setString(null);
try
{
dbConnect(); //connects to DB
clearSchedules(); // deletes data in tables
readFile(); // reads first file and calls the other functions
dbClose();// closes the DB
progressBar.setIndeterminate(false);
progressBar.setValue(100);
}
catch (Exception e1){
System.err.println("Error: " + e1.getMessage());
}
}
}
}
顺便说一句,我想让操作栏随着程序的进行而实际移动,但我不确定如何监控它的进度。
谢谢,牛肉。
更新这是我的 SwingWorker 示例以及我如何使用它:
全局声明
private functionWorker task;
private abstract class functionWorker extends SwingWorker {
public void execute() {
try {
dbConnect();
} catch (SQLException e) {
e.printStackTrace();
}
clearSchedules();
try {
readFile();
} catch (IOException e) {
e.printStackTrace();
}
dbClose();
}
}
在我的 actionPerformed 方法中
if( e.getSource() == genButton )
{
progressBar.setIndeterminate(true);
progressBar.setString(null);
try
{
task.execute();
progressBar.setIndeterminate(false);
progressBar.setValue(100);
}
catch (Exception e1){
System.err.println("Error: " + e1.getMessage());
}
}
【问题讨论】:
-
请学习java命名约定并遵守它们
-
通常,覆盖 doInBackground 不执行 ... 无论如何都是最终的。检查您的 jdk 和类路径,如果在 6+ 上删除任何 swingworker.jar(旧的独立版本)
-
@kleopatra 我的命名约定到底有什么问题?我读了它,我看不出我哪里出错了,至少在这些代码 sn-ps
-
类名应该大写
-
@kleopatra 啊谢谢,我会解决这个问题,我正在使用 jdk 7
标签: java swing actionlistener swingworker jprogressbar