我是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);
}
}
答案 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
来检查自己。