java - 在一个类中查找文件并在另一个类中输出/进度条
问题描述
我遇到的第一个问题是达到我的列表的大小,在 MainWindow 中,当我调用我的类时 getResult().size() 它为零,即使它在文件搜索类中增加得很好(如果你在搜索过程中打印出来) .
其次是我需要帮助如何让两个摇摆工人在两个班级之间进行交流。在一类中,它正在寻找文件,而在 MainWindow 中,它正在移动进度条。
我发现我需要使用 SwingPropertyChangeSupport 做一些事情,但我无法实现它。
我尝试在每个类中创建两个 swingworkers,一个用于在 MainWindow 中输出,另一个用于搜索(扩展 FileSearch 类)
而且由于我正在递归查找文件,因此我不确定这是否是正确的方法
if (temp.isDirectory()) {
new FileSearch(getFileNameToSearch(),temp).execute();
}
这东西^
public class FileSearch extends SwingWorker<Integer, String> {
private String fileNameToSearch;
private List<String> result;
private File file;
public FileSearch(String fileNameToSearch, File file) {
this.fileNameToSearch = fileNameToSearch;
this.file = file;
result = new ArrayList<>();
}
public String getFileNameToSearch() {
return fileNameToSearch;
}
public List<String> getResult() {
return result;
}
@Override
protected Integer doInBackground() throws Exception {
if (file.isDirectory()) {
System.out.println("Searching directory ... " + file.getAbsoluteFile());
if (file.canRead()) {
try{
for (File temp : file.listFiles()) {
if (temp.isDirectory()) {
new FileSearch(getFileNameToSearch(),temp).execute();
} else {
String temp2 = temp.getName().toLowerCase();
String trimmedName = temp.getName().toLowerCase();
try{
trimmedName = temp2.substring(0, temp2.lastIndexOf("."));
}catch(StringIndexOutOfBoundsException e){
}
if (getFileNameToSearch().equals(trimmedName)) {
result.add(temp.getAbsoluteFile().toString());
System.out.println(result.size());
}else{
System.out.println(getFileNameToSearch() + "!= " + trimmedName);
}
}
}
}catch(NullPointerException e){
}
} else {
System.out.println(file.getAbsoluteFile() + "Permission Denied");
}
}
return result.size();
}
和主窗口
public class MainWindow extends JFrame {
public MainWindow() {
initComponents();
fileChooser1.setApproveButtonText("Select");
fileChooser1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
directoriesTextArea.setEditable(false);
}
private void startButtonMouseClicked(MouseEvent e) {
directoriesTextArea.setText("");
SwingWorker<Void, String> worker = new SwingWorker<>(){
@Override
protected Void doInBackground() throws Exception {
File file = new File(absolutePathTextField.getText());
FileSearch filesearch = new FileSearch(fileNameTextField.getText(), file);
filesearch.execute();
int count = filesearch.getResult().size();
if(count == 0){
JOptionPane.showMessageDialog(new JFrame(), "There are no such files");
System.out.println(count);
}else{
for(String matched : filesearch.getResult()){
publish(matched);
}
}
return null;
}
@Override
protected void process(List<String> chunks) {
for(String matched : chunks){
directoriesTextArea.append(matched + "\n");
}
}
@Override
protected void done() {
directoriesTextArea.append("\nDone!");
}
};
worker.execute();
}
=================编辑版本=================
private void startButtonMouseClicked(MouseEvent e) {
directoriesTextArea.setText("");
progressBarCounter = 0;
progressBar1.setValue(0);
SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
List<String> result = new ArrayList<>();
@Override
protected Void doInBackground() throws Exception {
File file = new File(absolutePathTextField.getText());
FileSearch fileSearch = new FileSearch(fileNameTextField.getText(), file);
folderCount(file);
searchFiles(file);
return null;
}
@Override
protected void process(List<String> chunks) {
for(String file : chunks){
directoriesTextArea.append(file + "\n");
}
}
protected void folderCount(File file){
if (file.isDirectory()) {
if (file.canRead()) {
try {
for (File temp : file.listFiles()) {
if (temp.isDirectory()) {
folderCount(temp);
folderCount++;
}
}
} catch (NullPointerException e) {
}
}
}
progressBar1.setMinimum(0);
progressBar1.setMaximum(folderCount);
}
protected void searchFiles(File file) {
progressBarCounter++;
if (file.isDirectory()) {
System.out.println("Searching directory ... " + file.getAbsoluteFile());
if (file.canRead()) {
try {
for (File temp : file.listFiles()) {
progressBar1.setValue(progressBarCounter);
if (temp.isDirectory()) {
searchFiles(temp);
} else {
String temp2 = temp.getName().toLowerCase();
String trimmedName = temp.getName().toLowerCase();
try {
trimmedName = temp2.substring(0, temp2.lastIndexOf("."));
} catch (StringIndexOutOfBoundsException e) {
}
if (fileNameTextField.getText().toLowerCase().equals(trimmedName)) {
System.out.println(fileNameTextField.getText() + " == " + trimmedName);
publish(temp.getAbsolutePath());
} else {
System.out.println(fileNameTextField.getText() + "!= " + trimmedName);
}
}
}
} catch (NullPointerException e) {
}
} else {
System.out.println(file.getAbsoluteFile() + "Permission Denied");
}
}
}
};
worker.execute();
}
解决方案
您缺少进度/流程组合。在后台线程中,您需要定期调用 process 方法,以说明后台进程有多远。随后,会为您调用 progress 方法(在 EDT 线程中),您可以在那里更新进度条。 https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html
推荐阅读
- django - 继续重试 Celery 任务,仅在任务成功或达到最大重试次数时继续
- unit-testing - 单元/集成测试 tk 应用程序
- android - Kotlin:如何在不使用 getter 和 setter 的情况下更改 ViewModel 中 MutableLiveData 的值
- sql - 以多种方式使用多个参数
- json - jq 将 json 中的属性设置为整数值
- windows - 如何在 IIS 反向代理上启用 SSL 卸载
- xamarin.forms - Xamarin.Forms - iOS - 如果用户拒绝通知权限,然后在设置中手动更改,我如何获取 devicetoken?
- sql - Postgres:在查询的更多地方使用 NOW() 是否保证始终相同?
- python - 是否可以通过 Python3 Kivy 中的打印机直接打印 boxlayout 的内容?
- node.js - 每次用户访问站点时,Node 中运行一次的正确方法是什么?