Use of SwingWorker to do complex tasks in backgrou

2019-01-29 03:14发布

问题:

I am having a GUI of login screen. Whenever i press the login button the user name and password is checked against entry in an online mysql database,i'm extracting all this information from database in actionPerformed() method of the login button.Problem is while program is fetching data from database the GUI freezes.I googled my problem and found that i should use SwingWorker but being a newbie i didn't get how to use SwingWorker for my purpose.

回答1:

First of all, declare a member variable in your class (it could be in your GUI class) of type SwingWorker like this:

private SwingWorker<Boolean, Void> backgroundProcess;

Then initialize the variable in your initialization code (constructor, onShow method event handler, etc) like this:

    backgroundProcess = new SwingWorker<Boolean, Void>() {

        @Override
        protected Boolean doInBackground() throws Exception {
            // paste the MySQL code stuff here
        }

        @Override
        protected void done() {
            // Process ended, mark some ended flag here
            // or show result dialog, messageBox, etc      
        }
    };

Then, in your actionPerfomed method, call the SwingWorker's execute method:

    backgroundProcess.execute();

If done correctly, the GUI shouldn't freezee after the button press event



回答2:

This simple example extends SwingWorker<Icon, Void> to fetch an Icon with Void intermediate results. Similarly, yours might extend SwingWorker<DataSource, Void> to fetch a DataSource.