2013-03-18 3 views
0

У меня есть приложение, которое соединяет файл reads на удаленном сервере. Файл динамически обновляется, поэтому я использую Timer class, чтобы периодически перечитывать этот файл. Workflow является следующее:Manipulation with JProgressBar in Swing

  • Открыть окно, в котором будет отображаться текст.

  • Начать чтение файла (перечитать один раз в 15 секунд с помощью таймера)

  • В 15 секунд окно заполняется данными или я получаю исключения в журнале. Исключения подавляются, и я продолжаю читать данные.

Исключения - моя проблема, потому что пользователь не знает, что происходит сейчас с приложением. Есть как минимум два Исключения, которыми я бежал: - Если файл отсутствует, я получаю FileNotFoundException. - Если сервер находится на обслуживании, я получаю другое исключение (я его поймаю, поэтому его имя не имеет значения).

Вот как выше выглядит в коде:

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"); 
    } 

То, что я хочу сделать, это добавить JProgressBar. При открытии главного окна отображается индикатор выполнения, а затем считываются данные. Если IOException выбрасывается 5 раз подряд, отобразите диалоговое окно опций. В противном случае закройте индикатор выполнения и покажите данные. Если удаленный файл становится недоступным, откройте диалоговое окно параметров. И нажав кнопку повтора, покажите индикатор выполнения ... тогда рабочий процесс начинается с самого начала.

Некоторые примеры кода помогли бы мне, но я не ожидаю решения всей проблемы - будет достаточно советов, как это должно быть сделано в правильном направлении от проектной точки зрения. Образцы Oracle немного расплывчаты для меня.

+0

* «Я не прошу дать мне реализацию». * Вы задаете вопрос? Если так, то, что это? –

+0

Я неправильно выразился. Я имел в виду, что некоторые примеры кода помогли бы мне, но я не ожидал решения для моей проблемы - советы, как это должно быть сделано правильно с точки зрения дизайна и т. Д. Я редактирую его. – Dragon

+0

Если доступна Java 7, см. Это [Q & A] (http://stackoverflow.com/q/7784909/230513). – trashgod

ответ

1

Даже если WatchService, видел here, нет, я бы до сих пор используют SwingWorker, видел here и here.

  • Вы значительная свобода в расхаживать по doInBackground() нитей, например, Thread.sleep(15 * 1000).

  • Вы можете setProgress() в фоновом режиме и слушать любые PropertyChangeEvent в GUI.

  • Вы можете обновить любые компоненты графического интерфейса пользователя в process(), который работает на EDT.

+0

Я все еще не понимаю, как управлять PropertyChangeEvent при исключении (FileNotFoundException). Я добавил булевский флаг, чтобы контролировать, было ли исключено исключение. В зависимости от этого флага я показываю или скрываю окно индикатора выполнения. Но я не знаю, как уволить это событие.Например: public void readData() { try { // прочитанный файл } catch (FileNotFoundException ex) { isException = true; // Здесь я должен запустить PropertyChangeEvent, если я не ошибаюсь и создаю где-нибудь окно индикатора выполнения. } Или я думаю не так? – Dragon

+0

Да, вы можете распространять 'PropertyChangeEvent', чтобы сигнализировать' FileNotFoundException', но вы также можете передать результат в реализацию 'publish()/process()'. Также рассмотрите [* WatchService для Java 6 *] (http://stackoverflow.com/q/7968488/230513). – trashgod