我已经修改了我的 Windows 7 搜索程序,将匹配的文件写入JTable
. 在此之前,我正在写一个JTextArea
. 输出很丑;因此JTable
输出。但是JTable
,如果搜索数千个文件,程序会时不时地变得无响应。(不是这样JTextArea
。非常顺利。)
我的问题是如何提高响应能力。
我有一个Thread
被调用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;
}
}
这是 的类头TASK
:
public class TASK extends SimpleFileVisitor<Path> implements Runnable{
这是run
:
public void run()
{
SearchyGUI.disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(path , this);
}
这是树遍历的主要例程(还有其他 3 个,一个用于处理目录,一个用于后处理,一个用于错误):
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;
}
匹配的文件及其信息被写入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;
}
}
为了提高响应能力,我不知道是否需要另一个Thread
来写入JTable
或者是否需要使用SwingWorker
. 无论哪种情况,我都不确定如何实施。
假设另一个Thread
,我会把report
方法变成一个类implements Runnable
吗?我在可视化实现时遇到了麻烦,但如果必须的话,我可能会弄清楚。
我曾经在这个程序中使用过SwingWorker
,可能不正确(没有Thread
)。当输出区域不断闪烁时,我放弃了它。所以我不热衷于走那条路,但如果可取的话,我会弄清楚的。
我不认为这个问题属于“意见”领域。需要有关如何提高响应能力的建议。如果有人可以提前指出错误,我只是不想走错路。