2012-03-11 38 views
2

我正在使用摆动工作人员验证文件, 我想将startLine和endLine发送到验证类,因为我不想每次都验证整个文件。当第一次当一个现有的文件是openend时,我想发送startLine 0和endLine as endLine = editorTextArea.getLineCount() - 1 ;.在那之后,我应该可以每秒钟将startLine和endLine发送到我方便的地方。我如何实现这一目标?在不同参数的不同位置调用摆动工作人员

Validate类:

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

回答

5

SwingWorker一个内部使用一个ExecutorService,但是工人 “仅设计用于执行一次”。我不明白你为什么将工人包装在按固定费率排列的Runnable中。相反,​​任务一次,并让它publish()中期结果可以在EDT上编辑process()。对于行号,SwingWorker<Boolean, Integer>可能是合适的。 Integer将表示处理的最后一行数,而Boolean将表示由doInBackground()返回的最终验证结果。

如果用户正在异步选择多个文件进行验证,请考虑将每个正在执行的工作人员添加到合适的TableModel并在相应的JTable中显示结果。 @mKorbel展示了JProgressBar的几个examples

附录:如果您在确认增加JTextArea,你每次想​​一个新的工作,通过行号的新系列作为参数传递给工人的构造。这example,通过一个单一的int count,可能会建议的方法。触发器可以是您最初提议的java.util.Timerjavax.swing.Timer或甚至ScheduledExecutorService

+0

谢谢。我删除了runnable,这个场景是,当文件被打开时,文件应该被完全验证,我可以通过发送行号0和totallines来完成。但是,从下一次开始,即在jtextarea中对文件进行修改/更正时,只对在视口中可见的部分执行验证。我应该在什么事件中调用swingworker进行验证,是否需要将documentListener的insertUpdate方法放入? – FirmView 2012-03-11 12:18:29

+1

@FirmView:啊,我误解了。它认为将行号作为参数传递给工人的构造函数。更多上面。 – trashgod 2012-03-11 17:28:33

+0

我为你付出了努力。我在问什么事情我应该叫秋千工人。第一次,它将在文件打开,那么我应该不得不称之为文档监听器的方法? – FirmView 2012-03-11 20:31:44