【问题标题】:How to create a new JFrame with dynamic JLabels & JButtons without encountering NullPointerException?如何在不遇到 NullPointerException 的情况下创建具有动态 JLabels 和 JButton 的新 JFrame?
【发布时间】:2014-12-31 05:30:20
【问题描述】:

我一直在尝试创建一个场景,当单击按钮时,会生成一个新的 JFrame,其中包含 x 数量的 JLabels 和 JButton(x 取决于程序另一部分中的用户输入)。但是,每当我尝试这样做时,我都会收到“Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException”错误 我无法弄清楚错误是什么。我的代码语法很好,编译时没有错误。加粗的代码(不是真的,但有 ...)是错误指向的行。还有一些其他的行被指向,但那些是java生成的行。

**public class MainUI extends javax.swing.JFrame {**

public MainUI() {
    initComponents();
}
private void ViewList(java.awt.event.ActionEvent evt) {                                
    this.dispose();
    ListFrame list = new ListFrame();
    ArrayList<Type1> miniList1 = DataStorage.getMiniList1();
    ArrayList<Type2> miniList2 = DataStorage.getMiniList2();
    int counter = 0;
    java.awt.Label[] rLabels;
    rLabels = new java.awt.Label[miniList1.size() + miniList2.size()];
    javax.swing.JButton[] rButtons;
    rButtons = new javax.swing.JButton[rLabels.length];
for (int g=0;g<rLabels.length;g++)
{
    **rLabels[g].setPreferredSize(new Dimension(150,35));**
    rLabels[g].setAlignment(Label.CENTER);
    rLabels[g].setLocation(30,30*g);
}
for (int h=0;h<rButtons.length;h++)
{
    rButtons[h].setText("Show");
}
for (int i=counter;i<miniList1.size();i++)
{
    String name1 = miniList1.get(i).getName();
    rLabels[i].setText(name1);
    Type1 item1 = miniList1.get(i);
    rButtons[i].addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {
            ItemScreen iScreen = new ItemScreen();
            String item1Display = DataStorage.type1ToString(item1);
            iScreen.iTitleLabel.setText(name1);
            iScreen.iTextLabel.setText(item1Display);
            iScreen.setVisible(true);
        }

    });
    counter++;
}
for (int j=counter;j<miniList2.size() + counter;j++)
{
    String name2 = miniList2.get(j-counter).getName();
    rLabels[j].setText(name2);
    Type2 item2 = miniList2.get(j);
    rButtons[i].addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {
            ItemScreen iScreen = new ItemScreen();
            String item2Display = DataStorage.type2ToString(item2);
            iScreen.iTitleLabel.setText(name2);
            iScreen.iTextLabel.setText(item2Display);
            iScreen.setVisible(true);
        }

    });
}
for (int m=0;m<rLabels.length;m++)
{
    list.add(rLabels[m]);
}
for (int n=0;n<rLabels.length;n++)
{
    list.add(rButtons[n]);
}
    list.setVisible(true);
}

ListFrame 和 ItemScreen 是我项目中的 JFrame,而 DataStorage 是我项目中的另一个类。 Type1 和 Type2 是对象。我正在使用 NetBeans。

【问题讨论】:

标签: java swing nullpointerexception


【解决方案1】:

当您创建一个数组时,它会创建 n 数量的空/未初始化插槽

所以当你做类似...

rLabels = new java.awt.Label[miniList1.size() + miniList2.size()];

您所拥有的只是null 元素的数组...

在你可以修改给定位置的对象之前,你需要初始化给定槽的值...

for (int g=0;g<rLabels.length;g++)
{
    rLabels[g] = new JLabel();
    //...
}

这适用于所有数组。更多详情请关注the Arrays tutorial

【讨论】:

  • 谢谢!这行得通(我也必须对 rButtons 这样做)。
猜你喜欢
  • 1970-01-01
  • 2018-01-19
  • 2011-09-23
  • 2013-07-21
  • 2011-07-09
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2022-11-20
相关资源
最近更新 更多