Dragon
Dragon

Reputation: 2481

Manipulation with JProgressBar in Swing

I have an app that connects reads file on remote server. File dynamically updates that's why I use Timer class to reread this file periodically. Workflow is the following:

Exceptions are my problem, because user doesn't know what is happening now with an app. There are at least two Exceptions I ran at: - If file is absent, I receive FileNotFoundException. - If server is on maintenance I receive other Exception (I catch it, so its name doesn't matter).

Here is how above looks like in code:

public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            final RemoteReader reader = new RemoteReader();
            Timer timer = new Timer(15000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        reader.getMainPanel().readData();
                    } catch (IOException e) {
            //Here is a counter that increases after each exception throw
            if(counter >5) {
                JOptionPane.showOptionDialog(chat,
                    e.getMessage(),
                    e.getClass().getName(),
                    JOptionPane.OK_CANCEL_OPTION,
                    JOptionPane.INFORMATION_MESSAGE,
                    null,
                    new String[]{"Retry", "Cancel"}, //on Retry - make another 5 tries to read file, on cancel - close the window
                    null);
                counter = 0;
            }
                        e.printStackTrace();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            });
            timer.start();
            }
        });
    }

    public String readData() throws IOException {
    // read and process data before returning it
    // but for test purpose:
        //BufferedReader br = new BufferedReader(new InputStreamReader(this.url.openStream()));
    throw new IOException("cannot read file");
     }

What I want to do is to add JProgressBar. On openning the main window progress bar appears and then data is read. If IOException throws 5 times in a row, show option dialog. Otherwise hide progress bar and show data. If remote file becomes unavailable, show option dialog. And pressing the retry button, show progress bar... then workflow starts from the very beginning.

Some code examples would help me, but I don't expect solution for the whole issue - advice, how it should be done in right way from design point of view will be enough. Samples of Oracle a little bit vague for me.

Upvotes: 0

Views: 314

Answers (1)

trashgod
trashgod

Reputation: 205765

Even if WatchService, seen here, is not available, I'd still use SwingWorker, seen here and here.

  • You have considerable latitude in pacing the doInBackground() thread, e.g. Thread.sleep(15 * 1000).

  • You can setProgress() in the background and listen for any PropertyChangeEvent in the GUI.

  • You can update any GUI components in process(), which runs on the EDT.

Upvotes: 1

Related Questions