Попытка использовать SwingWorker в программе поиска, которая использует FileVisitor в потоке
Так продолжается эта ветка от 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();
графический интерфейс показывает, но когда я нажимаю кнопку поиска, ничего не происходит. Нет файловой прогулки. Нет ошибок Выход из TASK
даже не показывает. Так что нет шансов призвать SwingWorker
, (На самом деле, просто чтобы посмотреть, что может случиться [ничего], я удалил его из заголовка класса для TASK
: public class TASK /*extends SwingWorker*/ implements FileVisitor<Path>
.)
Если что-то очевидное не так, я хотел бы увидеть это. Если нет, я проведу много времени, пока SSCCE
,
1 ответ
Благодаря @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
,