为什么我的输出每次都为null?

时间:2014-10-19 19:36:34

标签: java swing

您好我有一个打开JFrame并接收文本的类。但是当我尝试获取文本时,它说它为空。 每次我单击按钮,我希望System.out打印我在textArea中输入的文本。

这是我的第一堂课:

public class FileReader {

    FileBrowser x = new FileBrowser();
    private String filePath = x.filePath;

    public String getFilePath(){

        return this.filePath;
    }

    public static void main(String[] args) {
        FileReader x = new FileReader();
        if(x.getFilePath() == null){
            System.out.println("String is null.");
        }
        else
        {
            System.out.println(x.getFilePath());
        }
    }
}

这是一个接收输入并将其存储在静态String中的JFrame。

/*
 * This class is used to read the location 
 * of the file that the user.
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.event.*;
import javax.swing.*;


public class FileBrowser extends JFrame{

    private JTextArea textArea;
    private JButton button;
    public static String filePath;

    public FileBrowser(){
        super("Enter file path to add");
        setLayout(new BorderLayout());

        this.textArea = new JTextArea();
        this.button = new JButton("Add file");

        add(this.textArea, BorderLayout.CENTER);
        add(this.button, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 100);
        setVisible(true);

        this.button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                filePath = new String(textArea.getText());
                System.exit(0);
            }
        });

    }
}

但每次我运行这些程序都会得到

String is null.

enter image description here

2 个答案:

答案 0 :(得分:3)

您对JFrames的工作方式感到误解。在关闭代码之前,JFrame不会停止执行代码。因此,基本上,您的代码会创建一个JFrame,然后在用户可能指定文件之前抓取该对象中的filePath变量。

因此,要解决此问题,请将输出文件路径的代码移至stdout,并移至ActionListener。摆脱System.exit()电话,改为使用dispose()


更新:您应该拥有ActionListener的代码:

this.button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        filePath = new String(textArea.getText());

        if(filePath == null){
            System.out.println("String is null.");
        }
        else
        {
            System.out.println(filePath);
        }

        dispose();
    }
});

作为主要方法:

public static void main(String[] args)
{
    FileBrowser x = new FileBrowser();
}

答案 1 :(得分:1)

您的主要不会等到用户在textArea中指定了文本。您可以通过循环来阻止此行为,直到设置textArea中的文本,或者您可以将main函数的逻辑放入ActionListener来处理事件。 在第二种方式之后,main函数只创建一个新的FileBrowser对象。