[英]JTextField from separate class
Can anyone tell me why I keep getting a Null pointer exception for this. 谁能告诉我为什么我不断收到Null指针异常。 I have a JTextField in one class with a set and get method and in my second class i want to assign the JTextField value to a string variable. 我在一个带有set和get方法的类中有一个JTextField,在第二个类中,我想将JTextField值分配给一个字符串变量。 What am i missing here? 我在这里想念什么?
Heres the first class 继承人头等舱
public class GUI extends JPanel
{
private final JLabel startLocLabel;
private final JLabel endLocLabel;
public String startStringCity1;
public String endStringCity;
private final String startLocString = "Enter Starting Location: ";
private final String endLocString = "Enter Ending Location: ";
public JTextField startLocTextField = new JTextField(5);
public JTextField endLocTextField = new JTextField(5);
private final JButton runButton;
public GUI(Container pane)
{
final JFrame mainFrame = new JFrame("GPS");
startLocLabel = new JLabel(startLocString);
endLocLabel = new JLabel(endLocString);
runButton = new JButton("Run");
JPanel labelPane = new JPanel();
labelPane.add(startLocLabel, BorderLayout.LINE_START);
labelPane.add(startLocTextField, BorderLayout.LINE_END);
labelPane.add(endLocLabel);
labelPane.add(endLocTextField);
labelPane.add(runButton);
runButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Graph graph = new Graph();
graph.Graph();
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
}//end actionPerformed
});//end action listener;
//Main Frame GUI
mainFrame.add(labelPane, BorderLayout.PAGE_START);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setLocationRelativeTo(null);
}
public void setStartCity(String city1)
{
startStringCity1 = city1;
}
public String getStartCity()
{
return startStringCity1;
}
public void setEndCity(String endCity)
{
endStringCity = endCity;
}
public String getEndCity()
{
return endStringCity;
}
}
And the second 第二
public class Graph
{
public GUI gui;
private String getStartCity;
public void Graph()
{
getStartCity = gui.getStartCity();
System.out.println(getStartCity);
}
}
Here is the stack trace 这是堆栈跟踪
java.lang.NullPointerException
at minigps.Graph.Graph(Graph.java:42)
at minigps.GUI$1.actionPerformed(GUI.java:90)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3322)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Based upon the code you posted (which I presume is the full code) in the Graph class: 根据您在Graph类中发布的代码(我想是完整代码):
getStartCity = gui.getStartCity();
When is gui ever instantiated? gui何时实例化? A call to the graph method (note, methods should start with lowercase) will result in an NPE. 调用graph方法(注意,方法应以小写字母开头)将导致NPE。 Perhaps you meant to set it explicitly: 也许您打算明确设置它:
@Override
public void actionPerformed(ActionEvent e)
{
Graph graph = new Graph();
graph.gui = GUI.this;
graph.Graph();
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
}
That might solve the NPE in the code posted, but there are other issues here, such as 这样可以解决所发布代码中的NPE,但是这里还有其他问题,例如
gui.getStartCity();
The method getStartCity() returns startStringCity1, but at the time it is called this value will be null. 方法getStartCity()返回startStringCity1,但是在调用它时,该值将为null。 Perhaps, as the other answer pointed out, you meant to set it before calling the Graph method (did I mention methods should begin with a lowercase letter?) 也许,正如另一个答案所指出的那样,您打算在调用Graph方法之前进行设置(我是否提到方法应该以小写字母开头?)
The problem is that you're setting the city names after you create the graph. 问题是您在创建图表后要设置城市名称。 Change: 更改:
Graph graph = new Graph();
graph.Graph();
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
to: 至:
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
Graph graph = new Graph();
graph.Graph();
The root cause is that the method Graph
reads the value of the string before it's assigned via the setStartCity
method: 根本原因是Graph
方法在通过setStartCity
方法分配字符串之前先读取字符串的值:
public void Graph()
{
getStartCity = gui.getStartCity();
At the time the getStartCity = gui.getStartCity();
当时的getStartCity = gui.getStartCity();
is executed, the value of startStringCity1
is still null. 执行后, startStringCity1
的值仍为null。
This is not the better way to do, but works well. 这不是更好的方法,但是效果很好。 :). :)。
A class main: 一个班级主:
public class main {
private static GUI gui;
private static Graph graph;
public static void main(String[] args) {
gui = new GUI();
graph = new Graph(gui);
gui.addActionListner(graph);
gui.setVisible(true);
}
}
A class Graph 一个类图
public class Graph
{
private String getStartCity;
private final GUI gui;
public Graph(GUI gui)
{
this.gui = gui;
}
public void start() {
getStartCity = gui.getStartCity();
System.out.println(getStartCity);
}
}
A class GUI 类GUI
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GUI extends JPanel
{
private final JLabel startLocLabel;
private final JLabel endLocLabel;
public String startStringCity1;
public String endStringCity;
private final String startLocString = "Enter Starting Location: ";
private final String endLocString = "Enter Ending Location: ";
public JTextField startLocTextField = new JTextField(5);
public JTextField endLocTextField = new JTextField(5);
private final JButton runButton;
public GUI()
{
final JFrame mainFrame = new JFrame("GPS");
startLocLabel = new JLabel(startLocString);
endLocLabel = new JLabel(endLocString);
runButton = new JButton("Run");
JPanel labelPane = new JPanel();
labelPane.add(startLocLabel, BorderLayout.LINE_START);
labelPane.add(startLocTextField, BorderLayout.LINE_END);
labelPane.add(endLocLabel);
labelPane.add(endLocTextField);
labelPane.add(runButton);
// Main Frame GUI
mainFrame.add(labelPane, BorderLayout.PAGE_START);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setLocationRelativeTo(null);
}
public void addActionListner(final Graph graph) {
runButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
graph.start();
}// end actionPerformed
});
}
public void setStartCity(String city1)
{
startStringCity1 = city1;
}
public String getStartCity()
{
return startStringCity1;
}
public void setEndCity(String endCity)
{
endStringCity = endCity;
}
public String getEndCity()
{
return endStringCity;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.