Swing вывод массива
Всем привет! В книге Якова Файна есть задание:
"Модифицируйте класс Calculator.java так, чтобы все кнопки с цифрами хранились в массиве с десятью элементами, который должен быть объявлен вот так: Buttons[] numButtons= new Buttons[10]; Замените 10 строк кода, которые начинаются с button0=new JButton("0"); циклом, который создаёт кнопки и добавляет их в массив."
Исходный код программы:
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;
public class Calculator {
// Объявление всех компонентов калькулятора.
JPanel windowContent;
JTextField displayField;
JButton button0;
JButton button1;
JButton button2;
JButton button3;
JButton button4;
JButton button5;
JButton button6;
JButton button7;
JButton button8;
JButton button9;
JButton buttonPoint;
JButton buttonEqual;
JPanel p1;
// В конструкторе создаются все компоненты
// и добавляются на фрейм с помощью комбинации
// Borderlayout и Gridlayout
Calculator(){
windowContent= new JPanel();
// Задаём схему для этой панели
BorderLayout bl = new BorderLayout();
windowContent.setLayout(bl);
// Создаём и отображаем поле
// Добавляем его в Северную область окна
displayField = new JTextField(30);
windowContent.add("North",displayField);
// Создаём кнопки, используя конструктор
// класса JButton, который принимает текст
// кнопки в качестве параметра
button0=new JButton("0");
button1=new JButton("1");
button2=new JButton("2");
button3=new JButton("3");
button4=new JButton("4");
button5=new JButton("5");
button6=new JButton("6");
button7=new JButton("7");
button8=new JButton("8");
button9=new JButton("9");
buttonPoint = new JButton(".");
buttonEqual=new JButton("=");
// Создаём панель с GridLayout
// которая содержит 12 кнопок - 10 кнопок с числами
// и кнопки с точкой и знаком равно
p1 = new JPanel();
GridLayout gl =new GridLayout(4,3);
p1.setLayout(gl);
// Добавляем кнопки на панель p1
p1.add(button1);
p1.add(button2);
p1.add(button3);
p1.add(button4);
p1.add(button5);
p1.add(button6);
p1.add(button7);
p1.add(button8);
p1.add(button9);
p1.add(button0);
p1.add(buttonPoint);
p1.add(buttonEqual);
// Помещаем панель p1 в центральную область окна
windowContent.add("Center",p1);
//Создаём фрейм и задаём его основную панель
JFrame frame = new JFrame("Calculator");
frame.setContentPane(windowContent);
// делаем размер окна достаточным
// для того, чтобы вместить все компоненты
frame.pack();
// Наконец, отображаем окно
frame.setVisible(true);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
}
}
Вот что получилось у меня:
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;
public class Calculator {
// Объявление всех компонентов калькулятора
JButton[] numButtons;
JPanel windowContent;
JTextField displayField;
JButton button10;
JButton button11;
JButton button12;
JButton button13;
JButton buttonPoint;
JButton buttonEqual;
JPanel p1;
JPanel p2;
// В конструкторе создаются все компоненты и добавляются на фрейм с помощью комбинации Borderlayout и Gridlayout
Calculator() {
windowContent = new JPanel();
// Задаём схему для этой панели
BorderLayout b1 = new BorderLayout();
windowContent.setLayout(b1);
// Создаём и отображаем поле добавляем его в Северную область окна
displayField = new JTextField(30);
windowContent.add("North", displayField);
// Создаём кнопки, используя конструктор класса JButton, который принимает текст кнопки в качестве параметра
button10 = new JButton("+");
button11 = new JButton("-");
button12 = new JButton("/");
button13 = new JButton("*");
buttonPoint = new JButton(".");
buttonEqual = new JButton("=");
// Создаём панель с GridLayout которая содержит 12 кнопок - 10 кнопок с числами и кнопки с точкой и знаком равно
p1 = new JPanel();
GridLayout g1 = new GridLayout(4,3);
p1.setLayout(g1);
// Заменить 10 строк кода циклом, который создаёт кнопки и добавляет их в массив
numButtons = new JButton[10];
for (int i = 0; i < numButtons.length; i++) {
numButtons[i] = new JButton();
p1.add(numButtons[i]);
}
// Создаем панель +,-,/,* из домашнего задания
p2 = new JPanel();
GridLayout g2 = new GridLayout(4,3);
p2.setLayout(g2);
// Добавляем кнопки на панель p1
p1.add(buttonPoint);
p1.add(buttonEqual);
// Добавляем кнопки на панель p2
p2.add(button10);
p2.add(button11);
p2.add(button12);
p2.add(button13);
// Помещаем панель p1 в центральную область окна
windowContent.add("Center", p1);
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();
}
}
Сам цикл начинается со втрого примера кода со строки 58.
button0=new JButton("0");
button1=new JButton("1");
button2=new JButton("2");
button3=new JButton("3");
button4=new JButton("4");
button5=new JButton("5");
button6=new JButton("6");
button7=new JButton("7");
button8=new JButton("8");
button9=new JButton("9");
p1.add(button1);
p1.add(button2);
p1.add(button3);
p1.add(button4);
p1.add(button5);
p1.add(button6);
p1.add(button7);
p1.add(button8);
p1.add(button9);
оздав массив - я объявил компоненты калькулятора JButton[] numButtons; numButtons = new JButton[10];
Два верхних столбца я заменил циклом for и создал переменную numButtons которой присвоен массив с присвоением результата цикла [i] numButtons[i] = new JButton();
Во втрой столбец добавил кнопки и как параметр прописал переменную массива с результатом цикла p1.add(numButtons[i]);
И вот что вышло:
Собственно сам вопрос: Все ли я правильно сделал? Никак не могу понять как на кнопки добавить цифры? Я думал numButtons[i] = new JButton(); будет прописывать numButtons1 = new JButton("1") и т.д и будет добавлять цифры на кнопки, но этого не происходит, что я не так понял? Спасибо!
Ответы (1 шт):
Должно быть примерно так (добавил слушатель, чтобы показать, каким образом отображать на экране нажатые клавиши: в данном случае цифры):
import javax.swing.*;
import java.awt.GridLayout;
import java.awt.BorderLayout;
public class Calculator {
private final JPanel windowContent;
private final JTextField displayField;
private final JButton [] numberButtons = new JButton[10];
private final JButton buttonPoint;
private final JButton buttonEqual;
private final JPanel panel;
private Calculator() {
windowContent = new JPanel();
windowContent.setLayout(new BorderLayout());
displayField = new JTextField(30);
windowContent.add("North", displayField);
panel = new JPanel();
panel.setLayout(new GridLayout(4,3));
for (int i = 0; i < numberButtons.length; i++) {
int x = (i+1)%10;
numberButtons[x] = new JButton(String.valueOf(x));
panel.add(numberButtons[x]);
numberButtons[x].addActionListener(e -> pressNumberButton(numberButtons[x]));
}
buttonPoint = new JButton(".");
buttonEqual = new JButton("=");
panel.add(buttonPoint);
panel.add(buttonEqual);
windowContent.add("Center", panel);
JFrame frame = new JFrame("Calculator");
frame.setContentPane(windowContent);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
}
private void pressNumberButton(JButton button) {
displayField.setText(displayField.getText()+button.getText());
}
public static void main(String[] args) {
Calculator calc = new Calculator();
}
}
