有两个窗口:用户输入的 GUI 和找到的文件名列表的输出窗口。执行必须是用户可以通过按键停止的,并且必须让两个窗口都打开,因为程序处理子目录,因此它可以运行很长时间,可能会单步执行 100_000 个文件,产生大量输出或根本不产生输出,具体取决于用户的文件名模式匹配所选起始节点中遇到的文件。
这是我的问题:
如何查找允许用户终止的按键(例如,ESC 或 CTRL-C)?(单击红色 X 不是一个选项,因为它会关闭窗口;用户需要在终止之前查看找到的内容。这样做不会关闭任何一个窗口,因为一旦树遍历开始,所有按钮都将被禁用。)
我尝试将 keyListeners 放在几个地方,但是一旦单击“开始”按钮,所有的摆动组件都被禁用。
这似乎是一种常见的情况,我很惊讶我找不到任何直接回答问题的教科书、线程或 Google 信息。所以恐怕这不会是一件容易的事。这也就不足为奇了。我可能在这里找到了线索,但我无法编译它,并且其中包含的链接不会导致该代码片段。
单击“搜索”按钮时开始搜索:
private void jbSearchActionPerformed(ActionEvent evt) {
SearchyGUI.doIt();
}
该doIt()
方法通过以下扩展遍历目录树SimplefileVisitor
:
public class OverriddenFileVisitor extends SimpleFileVisitor<Path> {
...
}
public static void doIt(){
try {
visitor = new OverriddenFileVisitor();
info.setVisible(true);
Files.walkFileTree(SearchyGUI.p , visitor);
}
catch (Exception e) { }
}
}
jTextArea1
输出通过以下方法写入report()
:
public static void report(String s){
Output.jTextArea1.append(s + "\n");
}
这主要通过以下visitFile()
方法完成SimpleFileVisitor
:
public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
report(foundkt + "--" + f.getFileName().toString());
return FileVisitResult.CONTINUE;
}
这是主要课程:
public class SearchyGUI {
static Output info;
static Path p ;
static FileVisitor visitor ;
static GUI gui
public static void main(String args[]) {
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();
}
});
}