Вызов свингера в разные места с разными параметрами - PullRequest
2 голосов
/ 11 марта 2012

Я использую Swing worker для проверки файлов, я хочу, чтобы startLine и endLine были отправлены в класс validate, так как я не хочу проверять весь файл каждый раз.В первый раз, когда существующий файл является openend, я хочу отправить startLine как 0 и endLine как endLine = editorTextArea.getLineCount () - 1 ;.После этого я могу отправлять startLine и endLine для моего удобства каждую секунду.Как мне этого добиться?

Класс проверки:

  class Validate implements Runnable {

     private JTextArea editorTextArea;
     private JTextArea errorTextArea;
     private int startLine;
     private int endLine;

     public Validate(JTextArea editor, JTextArea error, startLine, endLine) {
         this.editorTextArea = editor;
         this.errorTextArea  = error;
         this.startLine = startLine;
         this.endLine = endLine;        
    }

@Override
public void run() {
    SwingWorker worker = new SwingWorker<Void, Void>() {
        @Override
        protected Void doInBackground() throws Exception {
            //CODE TO VALIDATE
            return null;
        }

        @Override
        protected void done() {                
            //CODE TO DISPLAY THE RESULT
        }
    };
    worker.execute();
    }
 }

Основной класс:

  //Calls the validate
   public void taskExecutor() {               
          ScheduledExecutorService scheduler =
                 Executors.newSingleThreadScheduledExecutor();
           final ScheduledFuture<?> timeHandle =
                 scheduler.scheduleAtFixedRate(new Validate(editorTextArea,   errorTextArea), 0, 1, SECONDS);                 
}


    private void openFileActionPerformed(java.awt.event.ActionEvent evt)      {                                      

  fileChooser.setCurrentDirectory(new File(".txt"));
int result = fileChooser.showOpenDialog(new JPanel());
int totLines = 0;
String[] content = null;

if (result == JFileChooser.APPROVE_OPTION) {
    try {
        filename = String.valueOf(fileChooser.getSelectedFile());
        setTitle(filename);

        FileReader fr = new FileReader(filename);
        editorTextArea.read(fr, null);
        fr.close();
        startLine = 0;
        endLine = editorTextArea.getLineCount() - 1;
        //here i want to call the validate class once. that is askExecutor();                
    } catch (IOException ex) {
        System.out.println(ex);
    }
}
}

1 Ответ

5 голосов
/ 11 марта 2012

A SwingWorker использует ExecutorService для внутреннего использования, но рабочий «предназначен только для выполнения один раз».Я не понимаю, почему вы завернули работника в Runnable, который запланирован с фиксированной ставкой.Вместо этого, execute() задание один раз и пусть publish() промежуточные результаты, которые могут быть process() отредактированы в EDT.Для номеров строк может подойти SwingWorker<Boolean, Integer>.Integer будет представлять последний обработанный номер строки, а Boolean будет представлять окончательный результат проверки, возвращаемый doInBackground().

Если пользователь асинхронно выбирает несколько файлов для проверки, рассмотрите возможность добавления каждого исполняющего работника вподходящий TableModel и отображение результатов в соответствующем JTable.@mKorbel показал несколько примеров с JProgressBar.

Приложение: Если вы проверяете добавления к JTextArea, вам нужно execute() новый работник каждый раз, передавая новый диапазон номеров строк в качестве параметров конструктору работника.Этот пример , который проходит один int count, может предложить подход.Триггер может быть java.util.Timer, javax.swing.Timer или даже ScheduledExecutorService, который вы первоначально предложили.

...