java - 为什么我的 JTextArea 在 while 循环中无法正确显示?

标签 java swing while-loop jtextfield jtextarea

我的 GUI 应用程序允许用户在 JTextField 对象中键入,说明要打开的文件的名称,并将其内容显示到 JTextArea 对象上。如果输入的信息由文件名组成,则它将检索其内容,否则,它将是一个目录,然后它将显示文件和文件夹。现在,我陷入困境,因为我的 JTextAreasetText() 无法正确显示内容。它只显示一次,这意味着我的 while 循环存在问题。你们能帮我一下吗?

请注意,下面的代码已更改为正确的工作版本,提供了以下所有有用的贡献者。

主类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

class MyFileLister extends JPanel implements ActionListener {

private JLabel prompt = null;

private JTextField userInput = null;

private JTextArea textArea = null;

public MyFileLister()
{
    prompt = new JLabel("Enter filename: ");
    prompt.setOpaque(true);
    this.add(prompt);

    userInput = new JTextField(28);
    userInput.addActionListener(this);
    this.add(userInput);

    textArea = new JTextArea(10, 30);
    textArea.setOpaque(true);
    JScrollPane scrollpane = new JScrollPane(textArea);
    this.add(textArea, BorderLayout.SOUTH);
}

Scanner s = null;
File af = null;
String[] paths;

public void actionPerformed(ActionEvent f)
{
    try
    {
        s = new Scanner(new File(userInput.getText()));

        while(s.hasNextLine())
        {
            String as = s.nextLine();
            textArea.append(as + "\n");
            textArea.setLineWrap(truea);
        }

    }
    catch(FileNotFoundException e)
    {
        af = new File(userInput.getText());

        paths = af.list();
        System.out.println(Arrays.toString(paths));

        String tempPath = "";
        for(String path: paths)
        {
            tempPath += path + "\n";
        }

        textArea.setText(tempPath);
    }
}
}

驱动程序类别:

import java.util.*;
import java.awt.*;
import javax.swing.*;


class TestMyFileLister {

public static void main(String [] args)
{
    MyFileLister thePanel = new MyFileLister();

    JFrame firstFrame = new JFrame("My File Lister");

    firstFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    firstFrame.setVisible(true);
    firstFrame.setSize(500, 500);
    firstFrame.add(thePanel);


}
}

这是我必须实现的屏幕截图之一。它表明,当用户输入目录时,它会显示该目录下的文件和文件夹列表。

screenshot_directory

我试图放入一个 if 语句,看看是否可以插入显示消息对话框,但我真的不知道该把它放在哪里。

public void actionPerformed(ActionEvent f)
{       
    try
    {
        s = new Scanner(new File(userInput.getText()));

        if(af == null)
        {
            System.out.println("Error");
        }

        while(s.hasNextLine())
        {
            String as = s.nextLine();
            textArea.append(as + "\n");
            textArea.setLineWrap(true);
        }

    }
    catch(FileNotFoundException e)
    {
        af = new File(userInput.getText());

        paths = af.list();
        System.out.println(Arrays.toString(paths));

        String tempPath = "";
        for(String path: paths)
        {
            tempPath += path + "\n";
        }

        textArea.setText(tempPath);
    }   
}

最佳答案

您正在根据列表中的最后一个文件将文本输出到textArea! (不要直接在循环内将文本设置为 JTextArea,循环速度很快,UI 无法渲染它,因此请连接字符串,然后在循环结束后设置它)。

     // These lines below are causing only last file shown.

    for(String path: paths)
    {
        textArea.setText(path);
    }

这是您对 MyFileLister 类的修改版本:

public class MyFileLister extends JPanel implements ActionListener {

private JLabel prompt = null;  
private JTextField userInput = null;    
private JTextArea textArea = null;

public MyFileLister()
{
    prompt = new JLabel("Enter filename: ");
    prompt.setOpaque(true);
    this.add(prompt);

    userInput = new JTextField(28);
    userInput.addActionListener(this);
    this.add(userInput);

    textArea = new JTextArea(10, 30);
    textArea.setOpaque(true);
    JScrollPane scrollpane = new JScrollPane(textArea);
    this.add(scrollpane, BorderLayout.SOUTH);
}

Scanner s = null;
File af ;
String[] paths;

public void actionPerformed(ActionEvent f)
{
    try
    {
        s = new Scanner(new File(userInput.getText()));

        while(s.hasNext())
        {
            String as = s.next();
            textArea.setText(as);
        }

    }
    catch(FileNotFoundException e)
    {
        af = new File(userInput.getText());

        paths = af.list();
       System.out.println(Arrays.toString(paths));

       String tempPath=""; 
        for(String path: paths)
        {
           tempPath+=path+"\n";

        }
        textArea.setText(tempPath);

    }
}
}

输出:

enter image description here

关于java - 为什么我的 JTextArea 在 while 循环中无法正确显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25553250/

相关文章:

java - 如何在 Java 中使用 themoviedb.org api

java - objectify 中的附近搜索

Java Swing JFreeChart DialPlot 图例

c - 换行符在格式字符串中时 scanf 的行为

c - while(1) 循环减少 cpu 不休眠

java - 如何在处于接收状态时关闭 DatagramSocket

java - 循环分配/链接的 GWT 垃圾收集

java - 在 Java 程序中禁用 Windows 行为

java - 在 Java 中无需 Swing 即可获取文本输入

linux - bash 中的简单 while 循环