JButton处于紧迫状态

Bee*_*eef 4 java swing swingworker actionlistener jprogressbar

在我的Java GUI应用程序我有一个JButton和点击时调用一个function连接到一个database,然后调用functionclear一个tableDB,然后调用function从一个文件并加载读取文本variables,这就要求一个function从另一个文件中读取文本,进行比较在data从两个,然后调用function要么updateinsert数据在数据库中,所有这一切工作正常.

但是我的问题与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)

Chr*_*ett 7

问题可能与连接到UI线程中的昂贵操作(连接到数据库,从文件读取,调用其他函数)有关.在任何情况下都不应该从UI线程调用占用过多CPU时间的代码,因为整个界面在执行代码时无法继续,并且会导致"死"的应用程序,其中组件保持其状态为在昂贵的操作直到完成之前的时间.您应该执行另一个线程,在其中执行昂贵的工作,然后SwingUtilities.invokeLater(Runnable doRun)在更新进度的地方使用带有传递的runnable.

可能存在与组件状态相关的同步问题,但您可以稍后解决这些问题.


tra*_*god 6

我可以在执行操作时创建新线程并在线程中调用新函数,还是应该在实际函数本身内执行线程?

你就可以开始SwingWorker从您的按钮的处理程序,如图所示这里.这里Runnable可以看到实现的相关示例.


rin*_*rer 5

处理进度条的一种方法是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