我被告知我需要为长时间运行的目录树助行器创建一个SwingWorker
,其“胆量”显示在下面的部分中。 (为了保持简短,我已经删除了许多关闭}和)以及其他多余(对我的问题)的东西,例如忽略了catch子句。)
当匹配给定的文件名模式时,文件名(以及其他内容)由report()
写入文本区域:
public class TASK extends SimpleFileVisitor<Path> implements Runnable{
public static FileVisitResult disposition = FileVisitResult.CONTINUE;
private static void report(String s){
try{
Output.jTextArea1.append(s + "\n");
catch (Exception e){ aborted = true ; disposition = FileVisitResult.TERMINATE;}
public void run() {
disposition = FileVisitResult.CONTINUE;
Files.walkFileTree(p , this); // walkTreeFile calls visitFile() for each file.
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
report(f1.getFileName().toString());
return disposition;
main()
只为GUI和输出创建线程:
public static void main(String args[]) { // main
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
gui = new GUI();
gui.setVisible(true);
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
info = new Output();
单击“搜索”按钮时jbSearch...()
使输出窗口可见并实例化TASK
并开始树步行:
private void jbSearchActionPerformed(ActionEvent evt) { // this is in GUI
try {
TASK v = new TASK();
Thread t = new Thread(v);
t.start();
一切正常但是输出窗口闪烁并且看起来被黑了,所以我需要SwingWorker。 但我不能说以下,因为TASK
(或其他)必须延伸SimpleFileVisitor
:
class TASK extends SwingWorker<List<String>, String>
所以我正在寻找要实施的东西。我的笔记告诉我“因为SwingWorker实现了Runnable,所以可以将SwingWorker提交给Executor
执行”所以我认为除非有人阻止我,否则我会前往那里! (我之前从未使用过执行程序。)
在我弄清楚涉及SwingWorker之后,我假设我应该执行以下操作,可能在jbSearch...()
中代替显示的3行(上面):
TASK.execute();
我猜我必须调用doInBackground()
调用visitFile(),这是应用于walk中所有文件的内容。 填充doInBackground()
返回的数组是我的责任吗? SwingWorker的Java教程突然返回numbers
,它在任何地方都没有定义为数组或其他任何内容。< / p>
所以我猜我必须调用process()
调用(我的)report()
,它会将新信息附加到输出窗口(文本区域)。 我认为一旦doInBackground()
填充了数组,就很容易处理它们。
但是我在哪里放置get()
? SwingWorker的Java教程表明,get()
不是必需的,因为示例写入文本区域{ {1}}仅与System.out一起使用,以在控制台上显示相同的信息。
(编辑)哦是的... 我该怎样get()
?我想我会在publish()
内发布。
但是我还是张贴了,因为我认为这个问题和/或答案可能会成为有人提出有关SwingWorker的下一个问题的有价值的发现。
(编辑)我认为我面临的一个大问题是report()
或多或少“是”一个循环,在幕后反复调用walkFileTree
,结束时树结束或visitFile()
中的返回值设置为visitFile()
时。那么我只是将TERMINATE
粘贴在visitFile()
中,因为它或多或少已经在循环中了?然后把doInBackground()
放在它之后?
但是我该如何返回数组?
Ug的。
答案 0 :(得分:3)
所以我正在寻找实施的东西。我的笔记告诉我“因为 SwingWorker实现了Runnable,可以将SwingWorker提交给 执行执行人员“所以我想我接下来要去那里,除非 有人阻止了我! (我之前从未使用过执行程序。)
在我弄清楚如何涉及SwingWorker之后,我认为我应该这样做 以下,可能在jbSearch ...()中代替显示的3行 (就在上面):
TASK.execute();
是的,SwingWorker#execute
是启动SwingWorker的典型方式
我想我必须让doInBackground()调用visitFile(),这是 什么适用于walk中的所有文件。这是我的责任吗? 填充doInBackground()返回的数组? Java教程 SwingWorker突然返回未在任何地方定义的数字 是一个数组或任何其他。
应该从此方法调用您在后台完成的任何操作。
是的,您需要自己生成结果。实际值可以在任何地方定义,但我个人在doInBackground
方法的上下文中定义一个局部变量
所以我想我必须调用process()调用(my)report() 输出窗口(文本区域)的新信息。我假设一次 doInBackground()填充块数组,很容易处理 它们。
要处理值,您需要先publish
个。将这些值传递给process
时,将取决于后台进程的密集程度。
覆盖done
并调用get也可以让您访问在EDT上下文中从doInBackground
返回的内容
但是我在哪里放get()? SwingWorker的Java教程 表明get()不是必需的,因为示例写入a text区域和get()仅与System.out一起使用以显示相同内容 控制台上的信息。如果我不需要调用get(),也许我会更接近 在我开始这个时我想到的解决方案。
这取决于。你关心结果吗?如果你这样做,我倾向于在done
方法中调用它,因为通常我想使用EDT中的值。
关于get
的重要一点是,它是阻塞的,也就是说,它会等到doInBackground
返回