这将继续this thread of August 16, 2015
我正在修改我的Search程序以使用SwingWorker。原始代码(如下所示的main)有一个在main中调用的Thread,并从给定节点“遍历文件树”:
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在SwingWorker中是final )。
这是原始的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中的代码行导致了错误(没有合适的构造函数,因为现在的任务没有实现Runnable...):
t = new Thread(new TASK());如果我只说new TASK();,图形用户界面就会显示出来,但当我单击搜索按钮时,什么也没有发生。没有文件遍历。没有错误。TASK的输出甚至没有显示出来。所以没有机会调用SwingWorker。(实际上,为了看看会发生什么,我从TASK:public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>的类头中删除了它。)
如果有什么明显的错误,我很乐意看到它。如果没有,我会花很长时间制作一个SSCCE。
发布于 2015-08-18 02:40:02
多亏了@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中使用的类型。
https://stackoverflow.com/questions/32055869
复制相似问题