NPE при добавлении кнопок на панель калькулятора

157
07 декабря 2020, 16:10
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.awt.Component;
public class Calculator {
// объявление всех компонентов калькулятора
JPanel windowContent; // контейнер панели
//JTextField displayField; // поле отображения цифр
JFormattedTextField displayField; // форматируемое поле отображения цифр

JButton[] numButtons; // кнопки с 0 по 9
JButton buttonPoint; // кнопка "."
JButton buttonEqual; // кнопка "="
JButton buttonPlus; // кнопка "+"
JButton buttonMinus; // кнопка "-"
JButton buttonSlash; // кнопка "/"
JButton buttonStar; // кнопка "*"
JPanel p1; // левая панель с цифровыми кнопками
JPanel p2; // правая панель
// в конструкторе создаются все компоненты
// и добавляются на фрейм с помощью комбинации
// BorderLayout и GridLayout
Calculator () {
    windowContent = new JPanel();
    // задаем схему для этой панели
    BorderLayout bl = new BorderLayout();
    windowContent.setLayout(bl);
    //создаем и отображаем поле
    // добавляем его в Северную область экрана
    //numPeriodsField = new JFormattedTextField();
    //  numPeriodsField.setValue(new Integer(numPeriods));
    // numPeriodsField.setColumns(10);

    // displayField = new JTextField(30);
    displayField = new JFormattedTextField();
    displayField.setColumns(30);
    displayField.setHorizontalAlignment(SwingConstants.RIGHT);
    windowContent.add("North",displayField);
    //создаем кнопки, используя конструктор
    // класс JButton , который принимает текст
    //кнопки в качестве параметра
    //Buttons numButton [] = new Buttons [10];
    //numButtons = new Buttons[10];
    // JButton numButtons [] = new JButton [10];
    //
    //int s  = numButtons.length;
    numButtons = new JButton[9];
    for (int i=0; i<=9;i++){
        numButtons[i] = new JButton();
        p1.add(numButtons[i]);
    }
    buttonPoint=new JButton(".");
    buttonEqual=new JButton("=");
    buttonPlus=new JButton("+");
    buttonMinus=new JButton("-");
    buttonSlash=new JButton("/");
    buttonStar=new JButton("*");
// Создаём панель с GridLayout
// которая содержит 12 кнопок - 10 кнопок с числами
// и кнопки с точкой и знаком равно
    p1 = new JPanel();
    GridLayout gl =new GridLayout(4,3);
    p1.setLayout(gl);

// добавляем кнопки на панель pl
    p1.add(buttonPoint);
    p1.add(buttonEqual);
//помещаем панель  pl в центральную область окна
    windowContent.add("Center",p1);
//создаем панель с GridLayout
//которая содержит 4 кнопок
    p2 = new JPanel();
    gl = new GridLayout(4,1);
    p2.setLayout(gl);
// добавляем кнопки на панель pl
    p2.add(buttonPlus);
    p2.add(buttonMinus);
    p2.add(buttonSlash);
    p2.add(buttonStar);
//помещаем панель  p2 в центральную область окна
    windowContent.add("East",p2);
// создаем фрейм и задаем основную панель
    JFrame frame = new JFrame("Calculator");
    frame.setContentPane(windowContent);
// делаем размер окна достаточным
// для того чтобы вместить все компоненты
    frame.pack();
//отображаем окно (делаем окно видимым)
    frame.setVisible(true);
}
public static void main (String args[]){
    Calculator calc = new Calculator();
} 
}
Answer 1

Вы создаете панель после строк, в которых добавляете в нее кнопки.

переместите создание панели выше, над добавлением в нее кнопок + у Вас не верное условие в цикле i <= 9, оно вызывает IndexOutOfBoundsException, лучше написать i<numButtons.length

p1 = new JPanel();
numButtons = new JButton[9];
...
for (int i=0; i<numButtons  ;i++) { 
    numButtons[i] = new JButton();
    p1.add(numButtons[i]);
}

Вот код целиком:

import javax.swing.*; 
import java.awt.*; 
 
public class Calculator { 
// объявление всех компонентов калькулятора 
JPanel windowContent; // контейнер панели 
//JTextField displayField; // поле отображения цифр 
JFormattedTextField displayField; // форматируемое поле отображения цифр 
 
 
JButton[] numButtons; // кнопки с 0 по 9 
JButton buttonPoint; // кнопка "." 
 
JButton buttonEqual; // кнопка "=" 
JButton buttonPlus; // кнопка "+" 
JButton buttonMinus; // кнопка "-" 
JButton buttonSlash; // кнопка "/" 
JButton buttonStar; // кнопка "*" 
 
JPanel p1; // левая панель с цифровыми кнопками 
JPanel p2; // правая панель 
 
// в конструкторе создаются все компоненты 
// и добавляются на фрейм с помощью комбинации 
// BorderLayout и GridLayout 
 
Calculator () { 
    windowContent = new JPanel(); 
 
    // задаем схему для этой панели 
    BorderLayout bl = new BorderLayout(); 
    windowContent.setLayout(bl); 
    //создаем и отображаем поле 
    // добавляем его в Северную область экрана 
 
    //numPeriodsField = new JFormattedTextField(); 
    //  numPeriodsField.setValue(new Integer(numPeriods)); 
    // numPeriodsField.setColumns(10); 
 
 
    // displayField = new JTextField(30); 
    displayField = new JFormattedTextField(); 
    displayField.setColumns(30); 
    displayField.setHorizontalAlignment(SwingConstants.RIGHT); 
    windowContent.add("North",displayField); 
 
    //создаем кнопки, используя конструктор 
    // класс JButton , который принимает текст 
    //кнопки в качестве параметра 
 
    //Buttons numButton [] = new Buttons [10]; 
    //numButtons = new Buttons[10]; 
    // JButton numButtons [] = new JButton [10]; 
    // 
    //int s  = numButtons.length; 
// Создаём панель с GridLayout 
// которая содержит 12 кнопок - 10 кнопок с числами 
// и кнопки с точкой и знаком равно 
    p1 = new JPanel(); 
    GridLayout gl =new GridLayout(4,3); 
    p1.setLayout(gl); 
    numButtons = new JButton[9]; 
 
    for (int i=0; i<numButtons; i++){ 
        numButtons[i] = new JButton(); 
        p1.add(numButtons[i]); 
    } 
    buttonPoint=new JButton("."); 
    buttonEqual=new JButton("="); 
 
    buttonPlus=new JButton("+"); 
    buttonMinus=new JButton("-"); 
    buttonSlash=new JButton("/"); 
    buttonStar=new JButton("*"); 
 
 
 
 
// добавляем кнопки на панель pl 
    p1.add(buttonPoint); 
    p1.add(buttonEqual); 
 
//помещаем панель  pl в центральную область окна 
    windowContent.add("Center",p1); 
 
//создаем панель с GridLayout 
//которая содержит 4 кнопок 
    p2 = new JPanel(); 
    gl = new GridLayout(4,1); 
    p2.setLayout(gl); 
// добавляем кнопки на панель pl 
    p2.add(buttonPlus); 
    p2.add(buttonMinus); 
    p2.add(buttonSlash); 
    p2.add(buttonStar); 
 
//помещаем панель  p2 в центральную область окна 
    windowContent.add("East",p2); 
 
// создаем фрейм и задаем основную панель 
    JFrame frame = new JFrame("Calculator"); 
    frame.setContentPane(windowContent); 
 
// делаем размер окна достаточным 
// для того чтобы вместить все компоненты 
    frame.pack(); 
 
//отображаем окно (делаем окно видимым) 
    frame.setVisible(true); 
} 
 
public static void main (String args[]){ 
    Calculator calc = new Calculator(); 
}  
}

READ ALSO
Java. gif to Image[]

Java. gif to Image[]

Есть ли способ на java разложить *gif на image[]

127
Использование Lombok

Использование Lombok

Пишу веб-приложение и при объявлении сущностей использую ломбокПриложение компилируется и работает исправно, но в коде, где происходит работа...

156
Разделить переменную на несколько, SPLIT?

Разделить переменную на несколько, SPLIT?

Я ЧАЙНИК ! Не ругайтесь сильно ! дело в том что символ делителя ещё и повторяется в самом значении несколько разНа выходе имею кашу((( Как обозначить...

108
JS массив объектов

JS массив объектов

Я только начинаю учить JS и застряла на одном задании, прошу вашей помощи

131