Bee*_*eef 4 java swing swingworker actionlistener jprogressbar
在我的Java GUI应用程序我有一个JButton和点击时调用一个function连接到一个database,然后调用function到clear一个table在DB,然后调用function从一个文件并加载读取文本variables,这就要求一个function从另一个文件中读取文本,进行比较在data从两个,然后调用function要么update或insert数据在数据库中,所有这一切工作正常.
但是我的问题与JButton它有关,当它点击时我想运行一个Indeterminate progress bar正确的用户知道工作正在完成然后就在它离开之前action listener setIndeterminate to false并设置了progress barto 的值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());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我希望操作栏实际上随着程序的进展而移动,但我不确定如何监控其进度.
谢谢,牛肉.
这里更新是我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的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());
}
}
Run Code Online (Sandbox Code Playgroud)
问题可能与连接到UI线程中的昂贵操作(连接到数据库,从文件读取,调用其他函数)有关.在任何情况下都不应该从UI线程调用占用过多CPU时间的代码,因为整个界面在执行代码时无法继续,并且会导致"死"的应用程序,其中组件保持其状态为在昂贵的操作直到完成之前的时间.您应该执行另一个线程,在其中执行昂贵的工作,然后SwingUtilities.invokeLater(Runnable doRun)在更新进度的地方使用带有传递的runnable.
可能存在与组件状态相关的同步问题,但您可以稍后解决这些问题.
我可以在执行操作时创建新线程并在线程中调用新函数,还是应该在实际函数本身内执行线程?
你就可以开始SwingWorker从您的按钮的处理程序,如图所示这里.这里Runnable可以看到实现的相关示例.
处理进度条的一种方法是SwingWorker在类中扩展.
SwingWorker负责为您运行后台任务,因此您不必实现自己的线程,最终可能会出现未知问题.首先,负责进度条UI的类应该实现PropertyChangeListener
并实现public void propertyChange(PropertyChangeEvent evt) {- 根据全局变量更新进度条状态.
后台任务类应该如下所示(这可能是一个内部类):
class ProgressTask extends SwingWorker<Void, Void> {
@Override
public Void doInBackground() {
//handle your tasks here
//update global variable to indicate task status.
}
@Override
public void done() {
//re-enabled your button
}
}
Run Code Online (Sandbox Code Playgroud)
在你的按钮的事件监听器上:
public void actionPerformed(ActionEvent evt) {
//disable your button
//Create new instance of "ProgressTask"
//make the task listen to progress changes by task.addPropertyChangeListener(this);
//calll task.execute();
}
Run Code Online (Sandbox Code Playgroud)
我试图淡化代码示例,你必须阅读一些教程来了解所有这些部分是如何组合在一起的.但是,重点是不要编写你的线程代码,而是使用SwingWorker
| 归档时间: |
|
| 查看次数: |
3992 次 |
| 最近记录: |