为什么这个对象为空?

时间:2013-08-11 04:00:44

标签: java object null

我是Java的新手,我得到的是“java.lang.NullPointerException”

两个文本字段都返回null并且我不确定为什么我使用.setText()并且它显示在文本字段中

基本上我要做的是传递velocityTextView中的值并将其传递给 returnTextView。

我试过returnTextView.setText(velocityTextView.getText()); 我将此代码放在actionPerformed()方法中。

我卡住了,我会喜欢一些指导。

import java.awt.Color;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class kinematica implements ActionListener {

    public JPanel totalGui;
    public JLabel progTitle;
    public JButton enterBtn;
    public JTextField velocityTextField, returnTextField;


    public static void main(String[] args) {

        showGui();

    }

    public JPanel createContentPane() {

        //  GUI panel to contain the elements that make GUI
        JPanel totalGui = new JPanel();
        totalGui.setLayout(null);


        // Title Label 
        JLabel progTitle = new JLabel("Linear Motion 1D");
        progTitle.setLocation(10, 10);
        progTitle.setSize(500, 30);
        progTitle.setHorizontalAlignment(JLabel.LEFT);
        totalGui.add(progTitle);



        // Buttons
        JButton enterBtn = new JButton("Enter");
        enterBtn.setLocation(100, 200);
        enterBtn.setSize(100, 50);
        enterBtn.addActionListener(this);
        totalGui.add(enterBtn);


        // text fields
        JTextField velocityTextField = new JTextField(20);
        velocityTextField.setLocation(100, 50);
        velocityTextField.setSize(80, 30);
        velocityTextField.setText("Velocity =");
        totalGui.add(velocityTextField);

        JTextField returnTextField = new JTextField();
        returnTextField.setLocation(100, 100);
        returnTextField.setSize(80, 30);
        returnTextField.setText("test1");
        totalGui.add(returnTextField);


        totalGui.setOpaque(true);
        return totalGui;

    }


    public void actionPerformed(ActionEvent e) {

        returnTextField.getText();

        System.out.println(velocityTextField);

    }

    public static void showGui() {

        JFrame window = new JFrame("Kinematica");
        kinematica demoWindow = new kinematica();
        window.setContentPane(demoWindow.createContentPane());

        window.setSize(1500, 1000);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

3 个答案:

答案 0 :(得分:4)

createContentPane函数中删除所有类名。

当你说JLabel progTitle时,你正在为函数创建一个局部变量,因此不是在谈论成员变量。这会产生Variable Shadowing的情况,感谢MadProgrammer,这会导致您的问题。

因此,当您稍后访问成员变量时,它不受影响,因此null

更改

JTextField returnTextField = new JTextField();

returnTextField = new JTextField();

在该函数的这一行和类似行中。

答案 1 :(得分:2)

问题是,你正在影响你的变量。您将两个`JTextField'声明为实例字段

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    JTextField velocityTextField = new JTextField(20);
    /*...*/

    JTextField returnTextField = new JTextField();

然后,在createContentPane方法

中重新声明它们

相反,删除本地声明,例如......

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    velocityTextField = new JTextField(20);
    /*...*/

    returnTextField = new JTextField();

答案 2 :(得分:0)

正如Karthik所说:

createContentPane中删除班级名称。这看起来像是:

public JPanel createContentPane() {

    //  GUI panel to contain the elements that make GUI
    totalGui = new JPanel();
    totalGui.setLayout(null);


    // Title Label 
    progTitle = new JLabel("Linear Motion 1D");
    progTitle.setLocation(10, 10);
    progTitle.setSize(500, 30);
    progTitle.setHorizontalAlignment(JLabel.LEFT);
    totalGui.add(progTitle);



    // Buttons
    enterBtn = new JButton("Enter");
    enterBtn.setLocation(100, 200);
    enterBtn.setSize(100, 50);
    enterBtn.addActionListener(this);
    totalGui.add(enterBtn);


    // text fields
    velocityTextField = new JTextField(20);
    velocityTextField.setLocation(100, 50);
    velocityTextField.setSize(80, 30);
    velocityTextField.setText("Velocity =");
    totalGui.add(velocityTextField);

    returnTextField = new JTextField();
    returnTextField.setLocation(100, 100);
    returnTextField.setSize(80, 30);
    returnTextField.setText("test1");
    totalGui.add(returnTextField);


    totalGui.setOpaque(true);
    return totalGui;

}

为什么这样?因为您在方法中将类名放在变量名前面时声明了LOCAL变量。相反,您想要使用您声明的公共字段。为避免再次遇到此问题,我建议使用下划线的约定作为实例变量,而不是本地的下划线。因此,您可以使用_enterBtn代替enterBtn来检查自己。