【问题标题】:How to create a vector of JPanels?如何创建 JPanel 的向量?
【发布时间】:2015-12-21 10:10:51
【问题描述】:

我尝试向面板中添加在下面的类中定义的子面板数组,但我得到了java.lang.ArrayIndexOutOfBoundsException

public class PlayerPanel extends JPanel{
    public JPanel[] playerPanelArray;

    public PlayerPanel(int nrOfPlayers){    
        playerPanelArray = new JPanel[nrOfPlayers];

        for(int i = 0; i < nrOfPlayers; i++) {
            playerPanelArray[i] = new JPanel();
            playerPanelArray[i].add(new JButton("See if working"));
            add(playerPanelArray[i]);
        }
    }
}

我仍然不明白为什么我必须初始化 playerPanelArray 两次:

playerPanelArray = new JPanel[nrOfPlayers];

和:

playerPanelArray[i] = new JPanel();

如果我删除第一个,它会给我一个java.lang.NullPointerException

【问题讨论】:

  • 在哪一行出现错误?
  • 回答您的第二个问题,playerPanelArray= new JPanel[nrOfPlayers]; 仅初始化 数组,而 playerPanelArray[i]= new JPanel(); 初始化数组 的每个元素。你可以把数组想象成容器——你只是创建了一个足够大的盒子来放nrOfPlayers元素,但是这些元素在你调用new JPanel()之前不存在,这就是你正在做的在循环内。

标签: java arrays swing nullpointerexception jpanel


【解决方案1】:

您的第一条语句告诉编译器分配一个包含 JPanel 的 nrOfPlayers 数组。但是没有一个元素被关联,它们都包含null

第二条语句使用新的 JPanel 初始化每个元素,并将它们的引用放在之前分配的位置。如果不先分配数组,引用就无处可放。

【讨论】:

    【解决方案2】:

    如果你想使用一个向量,你需要使用类似的东西:

    Vector<JPanel> panels = new Vector<JPanel>(); 
    panels.add(new JPanel());
    

    它当前失败,因为没有分配任何元素,它们当前包含 null。

    playerPanelArray= new JPanel[nrOfPlayers]; 正在初始化数组,playerPanelArray[i]= new JPanel(); 正在实例化该特定索引处的对象,该索引当前为空。

    我会使用 ArrayList,我知道你在标题中说过如何使用向量,但除非这将是多线程的,否则我认为 ArrayList 会很好。

    【讨论】:

      【解决方案3】:

      我不明白为什么我必须初始化playerPanelArray 两次

      playerPanelArray = new JPanel[nrOfPlayers];
      

      这只是初始化了数组。数组中的任何非原始类型都必须单独初始化。如果不初始化这些数组元素,它们将是null,最终会导致 NPE。

      playerPanelArray[i] = new JPanel();
      

      初始化位置i的元素。当然,你把它放在一个循环中,这样你就可以初始化所有的元素。

      您为PlayerPanel 发布的代码运行良好。我建议您将其与当前应用程序中的代码进行比较,然后发布导致错误的部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-27
        • 2015-02-18
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        相关资源
        最近更新 更多