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中可见