1

我对 Java 相当陌生,我得到一个“java.lang.NullPointerException”

两个文本字段都返回为空,我不确定为什么我使用 .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);

    }

}
4

3 回答 3

4

createContentPane从函数中删除所有类名。

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

因此,当您稍后访问成员变量时,它不会被触及,因此null.

改变

JTextField returnTextField = new JTextField();

returnTextField = new JTextField();

在该函数中的此行和类似行中。

于 2013-08-11T04:02:33.510 回答
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();
于 2013-08-11T04:06:06.937 回答
0

正如卡尔提克所说:

从中删除类名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检查自己。

于 2013-08-11T04:08:10.797 回答