gpt4 book ai didi

java - 使用 For 循环初始化 JTextFields 和 JLabels 并将其添加到 JPanel 使用数组会导致错误

转载 作者:行者123 更新时间:2023-11-30 02:48:26 25 4
gpt4 key购买 nike

我正在尝试制作一个程序,该程序接受用户输入的类(class)中有多少学生以及他们的姓名/成绩,并计算平均成绩和字母成绩。我正在尝试更好地使用 For 循环数组,这就是我选择做的事情。唯一的问题是调用 init() 方法来创建窗口时。该类正在扩展 JFrame

import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class GradesGUI_2 extends JFrame {

static Scanner s = new Scanner(System.in);
static int num;

public static void main(String[] args) {

System.out.println("How many students are in your class?");
num = s.nextInt();

GradesGUI_2 window = new GradesGUI_2("Title");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//-------------------------------------------------

static JPanel p;
JTextField[] name = new JTextField[num], grade = new JTextField[num];
JLabel[] nlabel = new JLabel[num], glabel = new JLabel[num];
int height = 50;

//-------------------------------------------------

GradesGUI_2(String title) {
super(title);
this.init();
this.setVisible(true);
this.setLocationRelativeTo(null);
}

//-------------------------------------------------

void init() {
//Create JLabel/JTextField
for(int i = 0; i < num; i++) {
nlabel[i] = new JLabel("Name " + i);
glabel[i] = new JLabel("Grade " + i);
name[i] = new JTextField(10);
grade[i] = new JTextField(1);

height += 25;
}

for(int i = 0; i < num; i++) {
p.add(nlabel[i]);
p.add(glabel[i]);
p.add(name[i]);
p.add(grade[i]);
}



this.setSize(350, height);
this.add(p);
}

}

控制台显示的内容:

How many students are in your class?
7
Exception in thread "main" java.lang.NullPointerException
at GradesGUI_2.init(GradesGUI_2.java:59)
at GradesGUI_2.<init>(GradesGUI_2.java:40)
at GradesGUI_2.main(GradesGUI_2.java:20)

将组件添加到面板时会发生错误。请回答。谢谢!

最佳答案

异常堆栈跟踪指向此行:

        p.add(nlabel[i]);

因此,nlabel[i]null,或者 pnull。但 nlabel[i] 在上一个循环中被初始化为非空值,这表明 p 是罪魁祸首。解决此问题的一种方法是更改​​:

static JPanel p;

致:

JPanel p = new JPanel(); // with default FlowLayout

提示

  1. 不要将 GUI 组件声明为静态。使用 static 修饰符很少是一个好主意,而且我从未见过将它用于组件的情况 - 从来没有。
  2. 您需要弄清楚如何理解和解决堆栈跟踪中的异常。作为一名程序员,我们在我们的代码或我们要维护的代码中看到了许多这样的问题。重申一下我上面在评论中写的内容:请参阅 What is a stack trace, and how can I use it to debug my application errors? & What is a Null Pointer Exception, and how do I fix it?
  3. 不要将命令行输入与 GUI 混合使用。在这种情况下,一种方法是使用 JOptionPane.showInputDialog(..); 查询学生人数。

关于java - 使用 For 循环初始化 JTextFields 和 JLabels 并将其添加到 JPanel 使用数组会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39443440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com