Java 通过一个线程搜索数千个文件,然后;“树行者”;,将匹配项写入JTable会导致无响应
我修改了Windows 7搜索程序,将匹配的文件写入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(
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;
}
}