2015-06-03 2 views
2

Я проектирую консоль калькулятора, которая будет принимать два значения, создайте новый экземпляр класса AdditionProblem, который вернет массивы JLabel из 2 слагаемых проблемы, суммы и сумм переносится с каждого места (это показывает работу). У меня есть пользовательский класс, который расширяет JPanel и ArrayList JPanels, которые представляют каждую строку проблемы Solved после нажатия кнопки добавления. Класс AdditionProblem работает отлично, а также класс Main. Когда нажата кнопка добавления после того, как я создал класс консоли для отображения ответа, я получаю исключение нулевого указателя в строке 44 «row.add (новый JPanel)». Если вам нужно увидеть остальную часть моего кода, сообщите мне об этом, и я опубликую его, но чтобы сэкономить время, я просто опубликую класс Console, поскольку другие классы работают правильно, пока я не переместил код в этот класс.NullPointerException с ArrayList <JPanel> Калькулятор GUI

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)); 
    } 
} 

} 

ответ

1

Вы никогда не инициализируете своего члена private ArrayList<JPanel> rows;. Измените его на private ArrayList<JPanel> rows = new ArrayList<>();. То же самое относится к columns, хотя, похоже, он не используется нигде в коде, который вы опубликовали.

+0

Ой, вау, я чувствую себя немым ха-ха, спасибо! –

+0

Упростите мой вопрос, чтобы я мог поддержать ваш ответ: D –

3

Инициализировать ArrayList<>() в конструкторе.

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

Упростите мой вопрос, чтобы я мог поддержать ваш ответ: D –

+0

Вы можете отметить этот ответ как решение своего вопроса. –

+0

С благодарностью 4 минуты –

Смежные вопросы