来自单独 class 的 JTextField

JTextField from separate class

谁能告诉我为什么我总是收到空指针异常。我在一个 class 中有一个带有 set 和 get 方法的 JTextField,在我的第二个 class 中,我想将 JTextField 值分配给一个字符串变量。我在这里错过了什么?

这是第一个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;

    }
}

第二个

public class Graph
{

    public GUI gui;
    private String getStartCity;

    public void Graph()
    {
        getStartCity = gui.getStartCity();
        System.out.println(getStartCity);
    }
}

这是堆栈跟踪

java.lang.NullPointerException
    at minigps.Graph.Graph(Graph.java:42)
    at minigps.GUI.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.access0(EventQueue.java:97)
    at java.awt.EventQueue.run(EventQueue.java:702)
    at java.awt.EventQueue.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue.run(EventQueue.java:724)
    at java.awt.EventQueue.run(EventQueue.java:722)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.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)

问题是您在创建图表后设置城市名称。变化:

Graph graph = new Graph();
graph.Graph();
setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());

至:

setStartCity(startLocTextField.getText());
setEndCity(endLocTextField.getText());
Graph graph = new Graph();
graph.Graph();

根本原因是方法 Graph 在通过 setStartCity 方法赋值之前读取了字符串的值:

public void Graph()
{
    getStartCity = gui.getStartCity();

执行getStartCity = gui.getStartCity();时,startStringCity1的值还是null。

根据您在图表 class 中发布的代码(我认为是完整代码):

getStartCity = gui.getStartCity();

gui 什么时候实例化过?调用图形方法(注意,方法应以小写字母开头)将导致 NPE。也许您打算明确设置它:

        @Override
        public void actionPerformed(ActionEvent e)
        {
            Graph graph = new Graph();
            graph.gui = GUI.this;
            graph.Graph();
            setStartCity(startLocTextField.getText());
            setEndCity(endLocTextField.getText());
        }

这可能会解决发布的代码中的 NPE,但这里还有其他问题,例如

gui.getStartCity();

方法 getStartCity() returns startStringCity1,但在调用时此值为空。也许,正如另一个答案所指出的那样,您打算在调用 Graph 方法之前设置它(我是否提到方法应该以小写字母开头?)

这不是更好的方法,但效果很好。 :).

A class 主要:

    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);
    }

}

一个class图

    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);
    }
}

一个class图形界面

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;

    }
}