使用SwingWorker和FileVisitor,不会快速发布处理过的信息;GUI挂起。我更希望它没有,想要帮助解决这个问题,。
下面简要介绍如何使用SwingWorker和FileVisitor接口搜索符合用户指定条件的文件。:
public class Main
{
public static void main(String args[])
{
EventQueue.invokeLater( new Runnable() {
@Override public void run() {
gui = new GUI();
}});
}
}
//==============================================================
public class GUI extends JFrame
{
public GUI()
{
init();
createAndShowGUI();
}
private void init()
{
dftTableModel = new DefaultTableModel(0 , 4);
tblOutput = new JTable(dftTableModel);
tblOutput.setAutoResizeMode(AUTO_RESIZE_OFF);
scrTblOutput = new JScrollPane(tblOutput);
dftTableModel.setColumnIdentifiers(new Object[]{"Date", "Size", "Filename", "Path"});编辑如果我只包含这两行,问题可能会立即解决。
tca = new tablecolumnadjuster.TableColumnAdjuster(tblOutput);
tca.setDynamicAdjustment(true);
}
private static void btnSearchActionPerformed(ActionEvent evt)
{
TASK task = new TASK();
task.execute();
}
}
}
//==============================================================
public class TASK extends SwingWorker<Void,String>
{
private class rowRec{
String date;
int size;
String filename;
String pathname;
private rowRec(String d, int s, String f, String p)
{
date = d;
size = s;
filename = f;
pathname = p;
}
}
FV fv;
TASK() { fv = new FV(); }
//-------------- inner class
class FV implements FileVisitor<Path>
{
// When walk begins, internal FileVisitor code makes this routine
// loop until no more files are found OR disposition = TERMINATE.
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException
{
if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim()))
{
publish(s);
if(++k > parseInt(GUI.txtMaxMatches.getText()))
disposition = TERMINATE;
publish("Stopped at max. records specified");
}
return disposition;
}
}
//----------------
private void report(String s)
{
rowData = new rowRec(date, isize, filename, path);
dftTableModel.addRow(new Object[]{rowData.date, rowData.size, rowData.filename, rowData.pathname});
}
@Override
protected void process(List<String> chunks)
{
chunks.stream().
forEach
(
(chunk) ->
{
report(chunk);
}
);
kc += chunks.size();
System.out.println(kc); // *********************************
}
@Override
public Void doInBackground() throws Exception
{
disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(GUI.p ,fv);
}
}GUI启动SwingWorker的一个新实例,该实例的工作是显示(在JTable中)文件信息,该文件信息是由TASK实例找到的。TASK实例化FileVisitor,walkFileTree开始。在visitFile方法中找到的每个匹配文件都是为SwingWorker到process编辑的。
它大部分时间都能工作,但是如果有大量匹配的文件,GUI就会在几秒钟内失去响应;同时,大量的读取和显示已经发生,并且每读取几千个文件就会更新UI。
尽管使用SwingWorker来填充背景中的JTable,但显然(我猜)太多的匹配文件信息太快,跟不上。
所以我才这么说:
尽管visitFile有一个向TERMINATE发送信号的计数器,但process显然远远落后于向JTable添加记录。内部的println显示,随着时间的推移,传递的chunks数量有很大差异,这取决于FileVisitor查找匹配的速率:
41
81
138
250
604
1146
...
1417
1497
1590
1670
1672
1676
1680
1682
1692
1730
1788
1794
1797
1801
1807
1820
1826
1829
1847
1933
2168
10001visitFile终止后,process必须发送(10001-2168)或7833条记录到JTable,这花费了很长时间,而且用户界面大部分时间都没有响应。事实上,如果最大。比赛是(荒谬的) 10,000,程序挂了许多分钟,但10,000记录在JTable中。
,我不知道该怎么处理没有响应的问题。,我希望能够按下停止按钮,让程序停止。或者能够X (关闭)窗口。不行。
我是不是没有正确地使用SwingWorker ?--我不能让树基于SwingWorker行走,因为我没有可用的循环(它是内部的)。
很明显,javaw占用了25%的CPU时间,并且随着process的缓慢前进,它的内存分配以每秒大约16K的速度递增,直到它最终发布了最后一块。

编辑
我可能已经找到帮助here了。
但是,天哪,close??
我强调了我的问题。
发布于 2015-08-20 19:32:51
响应问题在一行代码中得到解决。
// tca.setDynamicAdjustment(true);
请参阅原始问题中的编辑。
发布于 2015-08-20 16:33:31
我不知道您的问题的解决方案,但我知道这不应该在SwingWorker或它的内部类中完成:
GUI.txtMaxMatches.getText())您应该获取EDT上的这些信息,并通过其构造函数将其传递到SwingWorker中。
https://stackoverflow.com/questions/32123469
复制相似问题