有人告诉我,我需要为长时间运行的目录树walker创建一个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(),这是应用于遍历中的所有文件的。填写doInBackground()返回的数组是我的责任吗? SwingWorker的Java教程突然返回numbers,它在任何地方都没有定义为数组或其他任何东西。

所以我想我必须进行process()调用(我的)report(),它将新信息附加到输出窗口(文本区域)。我假设一旦doInBackground()填充了大块的数组,将很容易对其进行处理。

但是我在哪里放get()? SwingWorker的Java教程建议不要使用get(),因为该示例写入文本区域,并且get()仅与System.out一起使用,以在控制台上显示相同的信息。

(编辑)哦,是的。。。我publish()是什么?我想我在report()内部发布。

但是,无论如何我都在发帖,因为我认为问题和/或答案可能是对有人问关于SwingWorker的下一个问题的宝贵发现。

(编辑)我认为我面临的一个大问题是walkFileTree或多或少“是”一个循环,在后台重复调用visitFile(),直到树结束或visitFile()中的返回值设置为时结束TERMINATE。那么我是否只是将visitFile()粘贴在doInBackground()中,因为它已经或多或少已经处于循环中了?然后紧跟publish()吗?

但是那我该如何返回一个数组呢?

g

最佳答案

所以我正在寻找实现的东西。我的笔记告诉我“因为
  SwingWorker实现Runnable,可以将SwingWorker提交给
  执行官执行”,所以我认为我下一步要去那里,除非
  有人阻止我! (我以前从未使用过执行程序。)
  
  在弄清楚如何参与SwingWorker之后,我认为我应该做
  以下,可能在jbSearch ...()中代替了显示的3行
  (正上方):
  
  TASK.execute();


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


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


您要在后台执行的任何操作都应从此方法调用。

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


  所以我想我必须让process()调用(my)report(),该追加
  新信息到输出窗口(文本区域)。我以为曾经
  doInBackground()填充大块数组,将很容易处理
  他们。


为了处理值,您需要先publish它们。将这些值传递给process的时间将取决于您的后台处理强度。

覆盖done并调用get还将使您能够在EDT上下文中访问从doInBackground返回的内容


  但是我应该把get()放在哪里? SwingWorker的Java教程
  建议不要使用get(),因为该示例写入了
  文本区域和get()仅与System.out一起使用以显示相同的内容
  控制台上的信息。如果我不需要调用get(),也许我更近了
  当我开始时想到的解决方案。


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

关于get的重要信息是它正在阻塞,也就是说,它将等到doInBackground返回

对于example

10-07 19:02
查看更多