Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过一个线程搜索数千个文件,然后;“树行者”;,将匹配项写入JTable会导致无响应_Java_Multithreading_Swing_Swingworker_Filevisitor - Fatal编程技术网

Java 通过一个线程搜索数千个文件,然后;“树行者”;,将匹配项写入JTable会导致无响应

Java 通过一个线程搜索数千个文件,然后;“树行者”;,将匹配项写入JTable会导致无响应,java,multithreading,swing,swingworker,filevisitor,Java,Multithreading,Swing,Swingworker,Filevisitor,我修改了Windows 7搜索程序,将匹配的文件写入JTable。在此之前,我正在给一个JTextArea写东西。产量不好,;因此JTable输出。但是使用JTable,如果搜索数千个文件,程序有时会变得无响应。(对于JTextArea,情况并非如此。非常平滑。) 我的问题是如何提高响应能力 我有一个线程,在main中调用,并从给定节点“遍历文件树”: public static void main(String args[]) { EventQueue.invokeLater(

我修改了Windows 7搜索程序,将匹配的文件写入
JTable
。在此之前,我正在给一个
JTextArea
写东西。产量不好,;因此
JTable
输出。但是使用
JTable
,如果搜索数千个文件,程序有时会变得无响应。(对于
JTextArea
,情况并非如此。非常平滑。)

我的问题是如何提高响应能力

我有一个
线程
,在
main
中调用,并从给定节点“遍历文件树”:

  public static void main(String args[]) {
      EventQueue.invokeLater(new Runnable() {
        public void run() {
          gui = new GUI();
          Utilities.disable(GUI.btnStop);
        }});   
     t = new Thread(new TASK());
     taskStarted = false;
  }
}
以下是
任务
的类标题:

public class TASK extends SimpleFileVisitor<Path> implements Runnable{
下面是树遍历的主要例程(还有3个,一个用于处理目录,一个用于后处理目录,一个用于错误):

匹配的文件及其信息将写入
JTable

      private static void report(...){
        ArrayList<String> rowData = new ArrayList<>(4);
              rowData.add(date);
              rowData.add(size);
              rowData.add(filename);    
              rowData.add(path);
              dftTableModel.addRow(new Object[]{rowData.get(0),rowData.get(1),rowData.get(2),rowData.get(3)});
          }
          catch (Exception e)
          { 
            SearchyGUI.disposition = FileVisitResult.TERMINATE;
          }
      }
私有静态无效报告(…){
ArrayList rowData=新的ArrayList(4);
rowData.add(日期);
rowData.add(大小);
rowData.add(文件名);
rowData.add(路径);
dftTableModel.addRow(新对象[]{rowData.get(0),rowData.get(1),rowData.get(2),rowData.get(3)});
}
捕获(例外e)
{ 
SearchyGUI.disposition=FileVisitResult.TERMINATE;
}
}
为了提高响应能力,我不知道是否需要另一个
线程来写入
JTable
,或者是否需要使用
SwingWorker
。在这两种情况下,我都不知道如何实施

假设有另一个
线程
,我会将
报告
方法转换成一个
实现可运行
的类吗?我在可视化实现方面遇到了困难,但如果必须的话,我可能可以解决这个问题

我曾经在这个程序中使用过
SwingWorker
,可能不正确(没有
线程)。当输出区域不断闪烁时,我放弃了它。所以我不想走那条路,但如果可行的话,我会想办法的

我认为这个问题不属于“意见”领域。需要关于如何提高响应能力的建议。如果有人能提前指出错误,我只是不想走错路


我曾经在这个程序中使用SwingWorker,可能不正确(没有线程)
-Swing worker自动是一个单独的线程,可能是您最好的方法。您所需要做的就是在结果可用时“发布”它们,这样您就不会有响应问题。有关SwingWorker和发布结果的更多信息,请阅读关于并发性的Swing教程当输出区域不停地闪烁时,我放弃了它。“没有理由闪烁。同样,从一个简单的示例开始,这样您就理解了这个概念,然后将知识应用到实际应用程序中。
“为了提高响应能力,我不知道是否需要另一个线程来写入JTable”
--不,不是另一个线程--您必须在Swing事件线程或EDT中写入表模型<代码>“…或者如果我需要使用SwingWorker。”
——这是一个有用的工具,允许您将信息从后台线程传递到事件线程。如果你不知道如何使用它,请仔细阅读本教程。
SwingWorker
。给EDT写信的好处。忘记了那个重要的原则。谢谢你们两个!对于。
我曾经在这个程序中使用SwingWorker,可能不正确(没有线程)
-Swing worker自动成为一个单独的线程,可能是您最好的方法。您所需要做的就是在结果可用时“发布”它们,这样您就不会有响应问题。有关SwingWorker和发布结果的更多信息,请阅读关于并发性的Swing教程当输出区域不停地闪烁时,我放弃了它。“没有理由闪烁。同样,从一个简单的示例开始,这样您就理解了这个概念,然后将知识应用到实际应用程序中。
“为了提高响应能力,我不知道是否需要另一个线程来写入JTable”
--不,不是另一个线程--您必须在Swing事件线程或EDT中写入表模型<代码>“…或者如果我需要使用SwingWorker。”
——这是一个有用的工具,允许您将信息从后台线程传递到事件线程。如果你不知道如何使用它,请仔细阅读本教程。
SwingWorker
。给EDT写信的好处。忘记了那个重要的原则。谢谢你们两个!对于
  public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
    if(a.isSymbolicLink())
      return SearchyGUI.disposition;
    File file = new File(f.getParent().toString(), f.getFileName().toString());
    try 
    {
      if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim())
          report(s);
    } catch (MalformedURLException | SAXException | TikaException ex) {msgbox(ex.toString());}
    return SearchyGUI.disposition;
  }
      private static void report(...){
        ArrayList<String> rowData = new ArrayList<>(4);
              rowData.add(date);
              rowData.add(size);
              rowData.add(filename);    
              rowData.add(path);
              dftTableModel.addRow(new Object[]{rowData.get(0),rowData.get(1),rowData.get(2),rowData.get(3)});
          }
          catch (Exception e)
          { 
            SearchyGUI.disposition = FileVisitResult.TERMINATE;
          }
      }