如何修改工作Java程序以涉及SwingWorker(因为输出窗口闪烁并且看起来被黑了)

时间:2013-11-16 20:13:42

标签: java swing swingworker

我被告知我需要为长时间运行的目录树助行器创建一个SwingWorker,其“胆量”显示在下面的部分中。 (为了保持简短,我已经删除了许多关闭}和)以及其他多余(对我的问题)的东西,例如忽略了catch子句。)

当匹配给定的文件名模式时,文件名(以及其他内容)由report()写入文本区域:

public class TASK extends SimpleFileVisitor<Path> implements Runnable{
  public static FileVisitResult disposition = FileVisitResult.CONTINUE;

  private static void report(String s){
      try{
        Output.jTextArea1.append(s + "\n");
      catch (Exception e){ aborted = true ; disposition = FileVisitResult.TERMINATE;} 

  public void run() {
      disposition = FileVisitResult.CONTINUE;
      Files.walkFileTree(p , this); // walkTreeFile calls visitFile() for each file.

  public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
    report(f1.getFileName().toString());
    return disposition;

main()只为GUI和输出创建线程:

  public static void main(String args[]) {          // main
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() { 
        gui = new GUI();
        gui.setVisible(true); 

    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        info = new Output();

单击“搜索”按钮时jbSearch...()使输出窗口可见并实例化TASK并开始树步行:

  private void jbSearchActionPerformed(ActionEvent evt) {   // this is in GUI
      try {
        TASK v = new TASK();
        Thread t = new Thread(v);
        t.start();

一切正常但是输出窗口闪烁并且看起来被黑了,所以我需要SwingWorker。 但我不能说以下,因为TASK(或其他)必须延伸SimpleFileVisitor

  class TASK extends SwingWorker<List<String>, String> 

所以我正在寻找要实施的东西。我的笔记告诉我“因为SwingWorker实现了Runnable,所以可以将SwingWorker提交给Executor执行”所以我认为除非有人阻止我,否则我会前往那里! (我之前从未使用过执行程序。)

在我弄清楚涉及SwingWorker之后,我假设我应该执行以下操作,可能在jbSearch...() 中代替显示的3行(上面):

  TASK.execute();

我猜我必须调用doInBackground()调用visitFile(),这是应用于walk中所有文件的内容。 填充doInBackground()返回的数组是我的责任吗? SwingWorker的Java教程突然返回numbers,它在任何地方都没有定义为数组或其他任何内容。< / p>

所以我猜我必须调用process()调用(我的)report(),它会将新信息附加到输出窗口(文本区域)。 我认为一旦doInBackground()填充了数组,就很容易处理它们。

但是我在哪里放置get() SwingWorker的Java教程表明,get()不是必需的,因为示例写入文本区域{ {1}}仅与System.out一起使用,以在控制台上显示相同的信息。

(编辑)哦是的... 我该怎样get()我想我会在publish()内发布。

但是我还是张贴了,因为我认为这个问题和/或答案可能会成为有人提出有关SwingWorker的下一个问题的有价值的发现。

(编辑)我认为我面临的一个大问题是report()或多或少“是”一个循环,在幕后反复调用walkFileTree,结束时树结束或visitFile()中的返回值设置为visitFile()时。那么我只是将TERMINATE粘贴在visitFile()中,因为它或多或少已经在循环中了?然后把doInBackground()放在它之后?

但是我该如何返回数组?

Ug的。

1 个答案:

答案 0 :(得分:3)

  

所以我正在寻找实施的东西。我的笔记告诉我“因为   SwingWorker实现了Runnable,可以将SwingWorker提交给   执行执行人员“所以我想我接下来要去那里,除非   有人阻止了我! (我之前从未使用过执行程序。)

     

在我弄清楚如何涉及SwingWorker之后,我认为我应该这样做   以下,可能在jbSearch ...()中代替显示的3行   (就在上面):

     

TASK.execute();

是的,SwingWorker#execute是启动SwingWorker的典型方式

  

我想我必须让doInBackground()调用visitFile(),这是   什么适用于walk中的所有文件。这是我的责任吗?   填充doInBackground()返回的数组? Java教程   SwingWorker突然返回未在任何地方定义的数字   是一个数组或任何其他。

应该从此方法调用您在后台完成的任何操作。

是的,您需要自己生成结果。实际值可以在任何地方定义,但我个人在doInBackground方法的上下文中定义一个局部变量

  

所以我想我必须调用process()调用(my)report()   输出窗口(文本区域)的新信息。我假设一次   doInBackground()填充块数组,很容易处理   它们。

要处理值,您需要先publish个。将这些值传递给process时,将取决于后台进程的密集程度。

覆盖done并调用get也可以让您访问在EDT上下文中从doInBackground返回的内容

  

但是我在哪里放get()? SwingWorker的Java教程   表明get()不是必需的,因为示例写入a   text区域和get()仅与System.out一起使用以显示相同内容   控制台上的信息。如果我不需要调用get(),也许我会更接近   在我开始这个时我想到的解决方案。

这取决于。你关心结果吗?如果你这样做,我倾向于在done方法中调用它,因为通常我想使用EDT中的值。

关于get的重要一点是,它是阻塞的,也就是说,它会等到doInBackground返回

example