使用ArrayList <jpanel>计算器GUI的NullPointerException

时间:2015-06-03 05:27:41

标签: java arrays arraylist jpanel jlabel

我正在设计一个计算器控制台,它将接收两个值,创建一个AdditionProblem类的新实例,它将返回问题的2个加数的JLabel数组,总和以及从每个地方携带的数量(它显示了工作)。我有一个自定义类,它扩展了JPanel和一个JPanels的ArrayList,它们代表了单击添加按钮后Solved问题的每一行。 AdditionProblem类和Main类一样正常。在我创建控制台类以显示答案后单击添加按钮时,我在第44行&#34; row.add(新JPanel)&#34;上得到空指针异常。如果您需要查看我的其余代码,请告诉我,我会发布它但是为了节省时间,我将发布Console类,因为其他类已经正常工作,直到我将代码移到此类。

package Main;

import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

import Aritmathic.AdditionProblem;

public class Console extends JPanel {

private int width = 230, height = 260;
private ArrayList<JPanel> rows;
private ArrayList<JLabel> columns;

private void init(){

    this.setPreferredSize(new Dimension(width, height));
    this.setBackground(Color.WHITE);
    this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

}

public Console(){

    init();

}

public void printAnswer(AdditionProblem problem){

    int rowIndex = 0;

    JLabel[] sumLabels = problem.getSumLabels();
    JLabel[] addend1Labels = problem.getAddend1Labels();
    JLabel[] addend2Labels = problem.getAddend2Labels();
    JLabel[] carriedLabels = problem.getCarriedLabels();

    rows.add(new JPanel());

    for(int i = 0; i < carriedLabels.length; i++){
        rows.get(rowIndex).add(carriedLabels[i]);
    }

    rowIndex++;
    rows.add(new JPanel());

    for(int i = 0; i < addend1Labels.length; i++){
        rows.get(rowIndex).add(addend1Labels[i]);
    }

    rowIndex++;
    rows.add(new JPanel());

    for(int i = 0; i < addend2Labels.length; i++){
        rows.get(rowIndex).add(addend2Labels[i]);
    }

    rowIndex++;
    rows.add(new JPanel());

    for(int i = 0; i < sumLabels.length; i++){
        rows.get(rowIndex).add(new JLabel("__"));
    }

    rowIndex++;
    rows.add(new JPanel());

    for(int i = 0; i < sumLabels.length; i++){
        rows.get(rowIndex).add(sumLabels[i]);
    }

    for(int i = 0; i < rows.size(); i++){
        this.add(rows.get(i));
    }
}

}

2 个答案:

答案 0 :(得分:3)

在构造函数中初始化ArrayList<>()

public Console(){
    rows = new ArrayList<JPanel>();
    columns = new ArrayList<JLabel>();
    init();
}

答案 1 :(得分:1)

您永远不会初始化您的private ArrayList<JPanel> rows;成员。将其更改为 private ArrayList<JPanel> rows = new ArrayList<>();。这同样适用于columns,但它似乎并未在您发布的代码中的任何位置使用。