在编码我的第一个 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.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class JFrameTest  {
    private MyListener listener = new MyListener();
    private JButton clear = null;
   private JButton addOne = null;
   private static JFrame frame = null;
   private JTextField text1 = null;
   private JTextField text2 = null;
   private JTextField text3 = null;
   private JTextField text4 = null;
   private JTextField text5 = null;
   private JTextField text6 = null;
public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
private static void createAndShowGUI() {
    //Create and set up the window.
    frame = new JFrame("Button & Listener Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JFrameTest().createGUI());
    //Display the window.
    frame.setSize(800, 500);
    frame.setVisible(true);
}
public JTabbedPane createGUI(){
    JTabbedPane tabbedPane = new JTabbedPane();
    JPanel one = new JPanel();
    one.setLayout(new BorderLayout());
    JPanel test = new JPanel();
    JPanel test2 = new JPanel();

   JLabel label1 = new JLabel ("Pound");
   JLabel label2 = new JLabel("Ounce :" );
   JLabel label3 = new JLabel("Ton :");
   JLabel label4 = new JLabel("Tonne :");
   JLabel label5 = new JLabel("Kilogram :");
   JLabel label6 = new JLabel("Gram :");
   text1 = new JTextField(5);
   text2 = new JTextField(5);
   text3 = new JTextField(5);
   text4 = new JTextField(5);
   text5 = new JTextField(5);
   text6 = new JTextField(5);
   JButton button = new JButton();
    clear = new JButton("Clear");
    clear.addActionListener(listener);
    text1.setText("0");
    text2.setText("0");
    text3.setText("0");
    text4.setText("0");
    text5.setText("0");
    text6.setText("0");
    test.add(label1);
    test.add(text1);
    test.add(label2);
    test.add(text2);
    test.add(label3);
    test.add(text3);
    test2.add(label4);
    test2.add(text4);
    test2.add(label5);
    test2.add(text5);
    test2.add(label6);
    test2.add(text6);
    one.add(test, BorderLayout.NORTH);
    one.add(test2, BorderLayout.CENTER);
    one.add(clear, BorderLayout.SOUTH);
    tabbedPane.addTab("Tab 1", one);
    JPanel two = new JPanel();
    tabbedPane.addTab("Tab 2", two);


    return tabbedPane;
    }


public class MyListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        JButton source = (JButton)e.getSource();
                    String sourceName = source.getName();
                    if(sourceName.equals("Clear"))
                    {
                        System.out.println("yeet");
                        text1.setText("00");                           
                        text2.setText("00");
                      text3.setText("00");
                       text4.setText("00");
                       text5.setText("00");
                      text6.setText("00");
                    }
                    else
                    {
                        System.out.println("nah");
                    }

    }
}

}

我的错误代码是:线程" awt-esventqueue-0"中的异常 java.lang.nullpoInterException 在jframetest.jframetest $ mylistener.actionperformed(jframetest.java:123) 在javax.swing.abstractbutton.fireactionperformed(AbstractButton.java:2022) 在javax.swing.abstractbutton $ handler.ActionPerformed(AbstractButton.java:2348) 在javax.swing.defaultbuttonmodel.fireactionperformed(DefaultButtonModel.java:402) 在javax.swing.defaultbuttonmodel.setpress(defaultbuttonmodel.java:259) 在javax.swing.plaf.basic.basicbuttonlistener.mousereared(basic buttonlistener.java:252) 在java.awt.component.processmouseeevent(component.java:6533) 在Javax.swing.jcomponent.jcomponent.processmouseeevent(jcomponent.java:3324) 在java.awt.component.processevent(component.java:6298) 在java.awt.container.processevent(Container.java:2236) at Java.awt.component.dispatcheventimpl(component.java:4889) 在java.awt.container.dispatcheventimpl(Container.java:2294) 在java.awt.component.dispatchevent(component.java:4711) 在java.aw.aw.lightweightdispatcher.retargetmouseevent(container.java:4888) 在java.aw.aw.lightweightdispatcher.processmouseeevent(Container.java:4525) 在java.aw.aw.lightweightdispatcher.dispatchevent(container.java:4466) 在java.awt.container.dispatcheventimpl(Container.java:2280) 在java.aw.window.dispatcheventimpl(window.java:2746) 在java.awt.component.dispatchevent(component.java:4711) 在java.aw.awt.eventqueue.dispatcheventimpl(eventqueue.java:758) 在Java.aw.awt.eventqueue.Access $ 500(Eventqueue.java:97) 在java.aw.awt.eventqueue $ 3.run(eventqueue.java:709) 在java.aw.awt.eventqueue $ 3.run(Eventqueue.java:703) 在java.security.accesscontroller.doprivileged(本机方法) 在java.security.security.protectiondomain $ javasecurityaccesimpl.dointersectionprivilege(protectiondomain.java:80) 在java.security.security.protectiondomain $ javasecurityaccessimpl.dointersectionprivilege(protectiondomain.java:90) 在java.aw.awt.eventqueue $ 4.run(Eventqueue.java:731) 在java.aw.awt.eventqueue $ 4.run(Eventqueue.java:729) 在java.security.accesscontroller.doprivileged(本机方法) 在java.security.security.protectiondomain $ javasecurityaccesimpl.dointersectionprivilege(protectiondomain.java:80) 在java.aw.awt.eventqueue.dispatchevent(eventqueue.java:728) 在java.aw.awt.eventdispatchthread.pumponeeventforfilters(eventdispatchthread.java:201) 在java.aw.awt.eventdispatchthread.pumpeventsforfilter(eventdispatchthread.java:116) 在java.aw.awt.eventdispatchthread.pumpeventsforhierarchy(eventdispatchthread.java:105) 在java.aw.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:101) 在java.aw.awt.eventdispatchthread.pumpevents(eventdispatchthread.java:93) 在java.aw.awt.eventdispatchthread.run(eventdispatchthread.java:82)

JButton的仅有的两个用法基本上是

clear = new JButton("Clear");
clear.addActionListener(listener);

所以,您没有为Component设置name
这里sourceNamenull

String sourceName = source.getName();

这是您的NullPointerException

sourceName.equals("Clear")

一般提示,在比较 String s时,请始终使用永远不会执行操作的 null,在这种情况下

if ("Clear".equals(sourceName)) { ... }

Component#getName方法(继承)似乎是为您构建名称,如果是null

if (name == null && !nameExplicitlySet) {
    synchronized(getObjectLock()) {
        if (name == null && !nameExplicitlySet)
            name = constructComponentName();
    }
}
return name;

但是,constructComponentName返回null

String constructComponentName() {
    return null; // For strict compliance with prior platform versions, a Component
                 // that doesn't set its name should return null from
                 // getName()
}

这是因为您没有设置按钮的 .name属性,而只是 text属性。默认构造函数设置text属性而不是name

您可以设置按钮的name属性。

    clear = new JButton("Clear");//this just set the text property
    clear.setName("Clear"); //here

或只是更改您的条件,例如

String sourceName = source.getText(); //chage .getName for .getText
if(sourceName.equals("Clear")) //now will work

相关内容

最新更新