-1

我是一个新的CS学生学习java。我正在尝试制作一个用户将在其中输入数字并显示结果的 gui。但是我遇到了一些我不熟悉的错误。我曾尝试在谷歌搜索,但它没有帮助。任何评论将不胜感激。谢谢。

人员类的主要方法

   import javax.swing.JFrame;
    public class person {
        public static void main(String[] args) {
            JFrame frame= new guifirst();//line 6
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }

桂一等

import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;
public class guifirst extends JFrame{
    private JLabel label;
    private JLabel label1;
    private JTextField text;
    private JButton button;
    private JPanel panel;

    public guifirst(){
        label=new JLabel("Enter a number");
        setSize(450,100);
        text=new JTextField(15);
        button=new JButton("Calculate");

        class addaction implements ActionListener{
            public void actionPerformed(ActionEvent event){
                double number=Double.parseDouble(text.getText());
                double result=number*number;
                label1=new JLabel("Your result is"+result);
            }
        }

        ActionListener listener=new addaction();
        button.addActionListener(listener);
        panel=new JPanel();
        panel.add(label);
        panel.add(label1);//line 32
        panel.add(text);
        panel.add(button);
        add(panel);
    }
}

错误:

 Exception in thread "main" java.lang.NullPointerException
        at java.awt.Container.addImpl(Container.java:1090)
        at java.awt.Container.add(Container.java:410)
        at person.guifirst.<init>(guifirst.java:32)
        at person.person.main(person.java:6)
4

5 回答 5

1

您尚未初始化label1,因此此行失败

panel.add(label1);

您正在尝试以一种在生成 UI 并单击按钮之前不会被调用的方法对其进行初始化

    class addaction implements ActionListener{
        public void actionPerformed(ActionEvent event){
            double number=Double.parseDouble(text.getText());
            double result=number*number;
            label1=new JLabel("Your result is"+result);
        }
    }

这是行不通的,因为在执行操作之前,该代码不会被执行。(Component标签)必须是 nonnull才能添加到JPanel.

您需要将其初始化为某个默认值才能开始。

于 2013-08-23T18:56:22.857 回答
1

您的问题是尝试添加label1而不实例化它。

panel.add(label1);

请记住,Object 类型的变量在 Java 中始终是引用,因此,即使您在调用之前实例化了 label1,您的 ActionListener 也不会替换框架中的标签;它只会更改您对其他内容的引用,同时将旧标签留在容器中。

相反,您应该实例化一个标签并将其添加到组件中。然后,在您的 ActionListener 中,使用该setText(String)方法更改标签显示的内容。

于 2013-08-23T18:56:36.310 回答
1

从文档开始Container#add

抛出: NullPointerException - 如果 comp 为 null

看起来下面的行是罪魁祸首

panel.add(label1);

由于actionPerformed在您调用.ActionListenernullpanel

于 2013-08-23T18:56:38.500 回答
0

试试这个

import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;

public class guifirst extends JFrame {
     JLabel label;
    private JLabel label1;
    private JTextField text;
    private JButton button;
    private JPanel panel;

    public guifirst() {
        label = new JLabel("Enter a number");
        label1 = new JLabel();
        setSize(450, 100);
        text = new JTextField(15);
        button = new JButton("Calculate");
        class addaction implements ActionListener {
            public void actionPerformed(ActionEvent event) {
                double number = Double.parseDouble(text.getText());
                double result = number * number;
                String result_S ="" + result;
                label1.setText(result_S);
            }

        }
        ActionListener listener = new addaction();
        button.addActionListener(listener);
        panel = new JPanel();
        panel.add(label);
        panel.add(label1);
        panel.add(text);
        panel.add(button);
        add(panel);
    }
}
于 2013-08-23T19:02:39.623 回答
0

异常堆栈跟踪的底部告诉您异常起源于代码中的何处:

at person.guifirst.<init>(guifirst.java:32)
at person.person.main(person.java:6)**

上面告诉你,第 6 行“person”类的 main 方法中的某些东西试图创建“guifirst”类的新对象,而构造函数(“ <init>”)中的某些东西在第 32 行抛出了 NullPointerException gui头等舱。

所以:看一下 guifirst.java 的第 32 行(没有行号,很难分辨代码示例的哪一行)。查看您是否尝试访问可能指向 null(而不是对象的实例)的引用的方法或属性。

诊断 NullPointerExceptions 时,一个好的经验法则是首先在代码中查找点(“.”),并确保句点左侧的任何内容都保证是对对象的引用。如果左侧可以为空,那么您在某个时候为 NullPointerException 设置了自己。

顺便说一句,由于您是 Java 新手,因此可能值得指出的是,Java 编码中有一个强大的既定约定,即类型名称(即类、接口和枚举)应以大写字母开头。我建议将您的人员类的名称更改为“Person”,将“guifirst”更改为“GuiFirst”。

于 2013-08-23T19:05:45.773 回答