这会继续this thread of August 16, 2015
我正在修改我的Search
程序以使用SwingWorker
。原始代码(main
如下所示)在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{
但是为了使用SwingWorker
,(我假设)我需要TASK extends SwingWorker
,使原始的run
命令非法(错误:run
为final
在SwingWorker
)。
这是原始run
:
public void run()
{
SearchyGUI.disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(path , this);
}
由于我无法使用run
,因此我在类TASK
的初始化之上创建了代码,如下所示:
public class TASK implements SwingWorker implements FileVisitor<Path> {
public void TASK()
{
System.out.println("Here we are starting TASK...");
SearchyGUI.disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(path , this);
}
但是现在下面的main
中的行会导致错误(没有合适的构造函数,因为现在TASK没有实现runnable ....):
t = new Thread(new TASK());
如果我只是说new TASK();
GUI显示,但是当我点击搜索按钮时,没有任何反应。没有文件走路。没有错误。 TASK
的输出甚至没有显示。所以没有机会调用SwingWorker
。 (事实上,只是为了查看可能会发生的事情[无]我将其从TASK
的类标题中删除了:public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>
。)
如果有任何明显的错误,我很乐意看到它。如果没有,我将花费很长时间制作SSCCE
。
答案 0 :(得分:0)
感谢@Hover,我有一个相当流畅的搜索程序。重点(即没有关于变量或逻辑的细节):
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
{
private static void btnSearchActionPerformed(ActionEvent evt)
{
TASK task = new TASK();
task.execute();
}
}
//==============================================================
public class TASK extends SwingWorker<Void,String>
{
FV fv;
TASK()
{
fv = new FV();
}
//-------------- inner class
class FV implements FileVisitor<Path>
{
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException
{
if(f.getFileName().toString().toLowerCase().matches(fPatt.toLowerCase().trim()))
{
publish(s); // old --> report(f); -- see process method below
}
return Main.disposition;
}
}
//----------------
protected Void doInBackground() throws Exception
{
Files.walkFileTree(path, fv);
return null;
}
// **EDIT** added new method
@Override
protected void process(List<String> chunks){
for (int i = 0; i < chunks.size(); i++) {
report(chunks.get(i));
}
}
}
唯一困扰我的是我没有实施publish
和process
以及其他SwingWorker
方法。
修改的
所以我在上面的代码中包含了两个。
编辑2
我根据TASK
的类定义更改了几个语句的类型:
public class TASK extends SwingWorker<Void,String>
SwingWorker
的第一个通用类型参数(上面是Void
)必须是doInBackground
(和get
返回的类型,如果使用的话)。
第二个String
,必须是publish
和process
中使用的类型。