java通过任务列出jtextarea中的文件名
我得到了一个文件集合(apachecommons.io),现在我想在jTextArea中列出主题,并尝试通过一个任务来实现这一点。不幸的是,textarea只列出了第一个文件。但在doInBackground中,我可以打印一个循环,然后列出所有文件 我想在遍历每个文件名时,在文本区域中为每个文件名添加一行java通过任务列出jtextarea中的文件名,java,swing,task,jtextarea,Java,Swing,Task,Jtextarea,我得到了一个文件集合(apachecommons.io),现在我想在jTextArea中列出主题,并尝试通过一个任务来实现这一点。不幸的是,textarea只列出了第一个文件。但在doInBackground中,我可以打印一个循环,然后列出所有文件 我想在遍历每个文件名时,在文本区域中为每个文件名添加一行 private class MyDeleteTask extends Task<String, String> { public MyDeleteTask(Applica
private class MyDeleteTask extends Task<String, String> {
public MyDeleteTask(Application app) {
super(app);
}
@Override
protected String doInBackground() throws Exception {
File file = new File("c:/files");
Collection<File> files = FileUtils.listFiles(file, null, true);
for (File f : files) {
publish(f.getAbsolutePath());
}
return "";
}
@Override
protected void process(List<String> values) {
jTextArea.append(values.get(0) + "\n");
}
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
用于(文件f:文件){
发布(f.getAbsolutePath());
}
返回“”;
}
@凌驾
受保护的无效进程(列表值){
jTextArea.append(values.get(0)+“\n”);
}
}
您只获取第一个值。值。get(0)
将只返回列表中的第一个元素,而不是列表中的所有元素。试试这个:
@Override
protected void process(List<String> values) {
for(String str:values)
jTextArea.append(str + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
jTextArea.append(str+“\n”);
}
您只获取第一个值。值。get(0)
将只返回列表中的第一个元素,而不是列表中的所有元素。试试这个:
@Override
protected void process(List<String> values) {
for(String str:values)
jTextArea.append(str + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
jTextArea.append(str+“\n”);
}
您正在使用第0个值。。。尝试使用for循环对其进行迭代
您正在使用第0个值。。。尝试使用for循环对其进行迭代。看起来发布的代码不正确。 调用publish()方法,该方法未被描述,但使用process()方法传递字符串列表 我猜你应该在这个过程中使用
for (String fName:values) {
jTextArea.append(fName + "\n");
}
看起来发布的代码不正确。 调用publish()方法,该方法未被描述,但使用process()方法传递字符串列表 我猜你应该在这个过程中使用
for (String fName:values) {
jTextArea.append(fName + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
{
jTextArea.append(str+“\n”);
}
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
{
jTextArea.append(str+“\n”);
}
}
老实说,我不认为您正在使用任务
(实际上是SwingWorker
子类)来解决您的情况
publish();你不是这样,因为我怀疑f.getAbsolutePath()
需要很长时间
我更愿意建议一些简单的重构,如下所示:
private class MyDeleteTask extends Task<String, Void> {
public MyDeleteTask(Application app) {
super(app);
}
@Override
protected String doInBackground() throws Exception {
File file = new File("c:/files");
Collection<File> files = FileUtils.listFiles(file, null, true);
StringBuilder paths = new StringBuilder();
boolean first = true;
for (File f : files) {
if (first) {
first = false;
} else {
paths.append('\n');
}
paths.append(f.getAbsolutePath());
}
return paths;
}
@Override
protected void succeeded(String value) {
jTextArea.setText(value);
}
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
StringBuilder路径=新建StringBuilder();
布尔值优先=真;
用于(文件f:文件){
如果(第一){
第一个=假;
}否则{
append('\n');
}
append(f.getAbsolutePath());
}
返回路径;
}
@凌驾
受保护的无效已成功(字符串值){
jTextArea.setText(值);
}
}
在这里,我认为最好是在后台计算整个文本区域的内容(如果有很多文件要列出,字符串操作可能需要很长时间),这样也可以避免多次调用jTextArea.append()
(我相信这会占用大量CPU,但这次直接在EDT内部,这是不好的,可能会导致“GUI冻结”可能很长一段时间),并用对setText()
的一次调用来替换它们,在这种情况下,该调用的性能要高得多。老实说,我不认为您使用任务
(实际上是SwingWorker
子类)是解决您的情况的最佳方法
publish()
仅当您可以在后台步骤之间调用它时才有用,而每个步骤都是长时间运行的;您的情况并非如此,因为我怀疑f.getAbsolutePath()
需要很长时间
我更愿意建议一些简单的重构,如下所示:
private class MyDeleteTask extends Task<String, Void> {
public MyDeleteTask(Application app) {
super(app);
}
@Override
protected String doInBackground() throws Exception {
File file = new File("c:/files");
Collection<File> files = FileUtils.listFiles(file, null, true);
StringBuilder paths = new StringBuilder();
boolean first = true;
for (File f : files) {
if (first) {
first = false;
} else {
paths.append('\n');
}
paths.append(f.getAbsolutePath());
}
return paths;
}
@Override
protected void succeeded(String value) {
jTextArea.setText(value);
}
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
StringBuilder路径=新建StringBuilder();
布尔值优先=真;
用于(文件f:文件){
如果(第一){
第一个=假;
}否则{
append('\n');
}
append(f.getAbsolutePath());
}
返回路径;
}
@凌驾
受保护的无效已成功(字符串值){
jTextArea.setText(值);
}
}
在这里,我认为最好是在后台计算整个文本区域的内容(如果有很多文件要列出,字符串操作可能需要很长时间),这样也可以避免多次调用jTextArea.append()
(我相信这会占用大量CPU,但这次直接在EDT内部,这是不好的,可能导致GUI冻结”可能很长一段时间),并用对setText()
的单个调用替换它们,在这种情况下,该调用的性能要高得多。publish()
函数做什么。还有jTextAera.append()
只从列表中获取第一个字符串
。publish是一个未实现的方法。它是一个(通常)未使用的任务方法。它只是为进程提供一个列表。publish()
函数做什么。还有jTextAera.append()
正在获取