Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非常烦人的AWT-EventQueue-0 NullPointerException。(几乎固定了。)_Java_Swing_Nullpointerexception_Actionlistener - Fatal编程技术网

Java 非常烦人的AWT-EventQueue-0 NullPointerException。(几乎固定了。)

Java 非常烦人的AWT-EventQueue-0 NullPointerException。(几乎固定了。),java,swing,nullpointerexception,actionlistener,Java,Swing,Nullpointerexception,Actionlistener,一直在四处研究,寻找许多答案,但没有运气 public class GUIinput extends JFrame{ //Num is the JTextfield variable used for later. public JTextField num; public JButton button; public void test(){ //JPanel JPanel panel = new JPanel(); //Welcome JLabel

一直在四处研究,寻找许多答案,但没有运气

public class GUIinput extends JFrame{

//Num is the JTextfield variable used for later.
public JTextField num;
public JButton button;

public void test(){
           //JPanel
    JPanel panel = new JPanel();

    //Welcome JLabel..Contains the welcome message.
    JLabel welcome = new JLabel("Welcome to my Grade Calculator program!");
    panel.add(welcome);

    //Instructions J Label on how to work the program.
    JLabel instructions = new JLabel("Enter your Mark and Weight to find your average grade!");
    panel.add(instructions);

    //JLabel---How many different assignments do the user want to evaluate?
    JLabel number = new JLabel("<html><br>Firstly, please enter how many assignments/exams you want to evaluate?</html>");
    panel.add(number);

    //JTextField assigner.
    num = new JTextField(18);
    panel.add(num);


    //Enter button
    button = new JButton("Enter");
    panel.add(button);


    //JFrame maker.
    setTitle("Grade Calculator");
    setSize(575,250);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(panel);

    //This action listener opens the new class Gradeanalysis(). The next window.
    button.addActionListener(new Gradeanalysis());

    //Action listener for the Textfield in case the user presses the enter key.
    num.addActionListener(new Gradeanalysis());

   }


public static void main(String[] args) {
    new GUIinput().test();


    }
}
现在我删掉了很多不需要的代码。因此,程序应该做的是从第一个窗口获取用户输入,当用户单击enter按钮时,输入应该显示在MessageDialog屏幕上。不是新的JFrame

现在我明白了问题是因为那行带有星号,特别是“num.getText()”部分

如果在该行上方添加“num=newjtextfield();”,MessageDialog屏幕将为空白。我希望它显示上一屏幕的输入


我不知道该怎么做。感谢您的帮助,谢谢。

您的问题在于:

//This action listener opens the new class Gradeanalysis(). The next window.
button.addActionListener(new Gradeanalysis());

//Action listener for the Textfield in case the user presses the enter key.
num.addActionListener(new Gradeanalysis());
您添加的新Gradeanalysis没有指向文本字段的指针,也没有初始化其字段。您应该更改动作侦听器,使其位于单独的类中,并传入其影响的字段

ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int messageType = JOptionPane.PLAIN_MESSAGE;

                JOptionPane.showMessageDialog(null, num.getText(), "fasfa", messageType);
                JFrame frame = new JFrame("Grade Calculator");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JPanel());//dont have create main panel method
                frame.pack();
                frame.setVisible(true);
            }
        };
        button.addActionListener(listener);

        num.addActionListener(listener);

你的问题在于:

//This action listener opens the new class Gradeanalysis(). The next window.
button.addActionListener(new Gradeanalysis());

//Action listener for the Textfield in case the user presses the enter key.
num.addActionListener(new Gradeanalysis());
您添加的新Gradeanalysis没有指向文本字段的指针,也没有初始化其字段。您应该更改动作侦听器,使其位于单独的类中,并传入其影响的字段

ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int messageType = JOptionPane.PLAIN_MESSAGE;

                JOptionPane.showMessageDialog(null, num.getText(), "fasfa", messageType);
                JFrame frame = new JFrame("Grade Calculator");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JPanel());//dont have create main panel method
                frame.pack();
                frame.setVisible(true);
            }
        };
        button.addActionListener(listener);

        num.addActionListener(listener);

从给定的代码中,不清楚
Gradeanalysis
是否可以看到您的
num
。您可以为这个类创建一个新的构造函数,以便
num
作为参数进入。像这样重新编写
Gradeanalysis

public class Gradeanalysis extends GUIinput implements ActionListener{

JTextField num;

public Gradeanalysis(JTextField num)
{
    this.num = num;
}
//Implement the actionPerformed here as u have..
}
然后从代码中调用
Gradeanalysis
,例如

button.addActionListener(new Gradeanalysis(num));

现在我将注意到,所执行的操作可能不会像您预期的那样对TextField起作用,并且a、make the others JDialogs或其他东西。

从给定的代码中,不清楚
Gradeanalysis
是否可以看到您的
num
。您可以为这个类创建一个新的构造函数,以便
num
作为参数进入。像这样重新编写
Gradeanalysis

public class Gradeanalysis extends GUIinput implements ActionListener{

JTextField num;

public Gradeanalysis(JTextField num)
{
    this.num = num;
}
//Implement the actionPerformed here as u have..
}
然后从代码中调用
Gradeanalysis
,例如

button.addActionListener(new Gradeanalysis(num));


现在我将注意到,执行的操作可能不会像您期望的那样对TextField起作用,并且a,使其他JDialogs或其他东西成为新的类。

仅为指针创建一个新类?所以现在应该是button.addActionListener(newclassname());我认为更好的解决方案是在将操作侦听器添加到组件之前,将其分配给变量或字段。添加了一个匿名内部类的示例,该示例应该可以工作,尽管如果它是separateThans,则会更好,但这将不适用于我的程序。我要做的是从GUIinput类获取输入,并将其作为Gradeanalysis类中的变量。我假设您的代码只在GUIinput类中完成上述所有操作。这将是一个问题,因为在GUI输入中执行的任何操作都会改变GradeAnaylis类的外观。是否只为指针创建一个新类?所以现在应该是button.addActionListener(newclassname());我认为更好的解决方案是在将操作侦听器添加到组件之前,将其分配给变量或字段。添加了一个匿名内部类的示例,该示例应该可以工作,尽管如果它是separateThans,则会更好,但这将不适用于我的程序。我要做的是从GUIinput类获取输入,并将其作为Gradeanalysis类中的变量。我假设您的代码只在GUIinput类中完成上述所有操作。这将是一个问题,因为在GUI输入中所做的任何事情都会改变GradeAnalysis类的外观。你知道
new
的功能吗?在我看来,你是继承的忠实粉丝。如果是这样的话,那就开始阅读关于构图的内容,它比继承更有益。您可以毫无理由地在代码中扩展类。您实际上没有增强他们的行为,而且为什么
Gradeanalysis
类正在扩展
GUIinput
?前者和后者有什么关系?当<代码> GUIinput <代码>充当代码> jFrase>代码>时,为什么在<代码>中创建一个新的<代码> jFrase>代码> >situation@immibis新公司将如何帮助我?创建新对象只会使num null/0,对吗?@nIcEcOw我的想法是从GUIinput类获取变量(num)。这就是我使用extend的原因。我需要从num中的用户那里获取Gradeanalysis类的输入。@bob9123:如果可以,请用简单的英语解释一下要求。就像您在
JTextField
中键入的内容一样,只要单击
JButton
,您就可以希望
JTextField
中的文本在
JOptionPane
中可见,后者是另一个类的一部分,其中定义了
actionPerformed(…)
。是吗?你知道什么是新的吗?在我看来,你是继承的忠实粉丝。如果是这样的话,那就开始阅读关于构图的内容,它比继承更有益。您可以毫无理由地在代码中扩展类。您实际上没有增强他们的行为,而且为什么
Gradeanalysis
类正在扩展
GUIinput
?前者和后者有什么关系?当<代码> GUIinput <代码>充当代码> jFrase>代码>时,为什么在<代码>中创建一个新的<代码> jFrase>代码> >situation@immibis新公司将如何帮助我?创建新对象只会使num null/0,对吗?@nIcEcOw我的想法是从GUIinput类获取变量(num)。这就是我使用extend的原因。我需要从num中的用户那里获取Gradeanalysis类的输入。@bob9123:如果可以,请用简单的英语解释一下要求。就像您在
JTextField
中键入的内容一样,只要单击
JButton
,您就可以希望
JTextField
中的文本在
JOpti中可见