Як передавати дані між класами
з цифрою на цьому калькуляторі, він не показує вікно повідомлення, а показує цю цифру на своєму дисплеї. Виникає запитання - нам потрібно отримати доступ до поля displayField класу Calculator з методу actionPerformed () класу CalculatorEngine. Це можна зробити, створивши в класі CalculatorEngine змінну, яка буде зберігати посилання на екземпляр об'єкта Calculator.
У наступній версії класу CalculatorEngine ми додамо конструктор. У цього конструктора буде один аргумент типу Calculator. Не дивуйтеся, аргументи у методів можуть мати тип класів, створених вами!
JVM виконує конструктор класу CalculatorEngine під час створення цього примірника в пам'яті. Клас Calculator створює CalculatorEngine, і передає його конструктору посилання на себе:
CalculatorEngine calcEngine = new CalculatorEngine (this);
Ці два рядки були взяті з такого прикладу: import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton;
// Конструктор зберігає посилання на вікно калькулятора
// в змінної класу "parent" CalculatorEngine (Calculator parent)
this .parent = parent;
public void actionPerformed (ActionEvent e)
// Отримати джерело поточного дії
JButton clickedButton = (JButton) e.getSource ();
// Отримати поточний текст з поля виведення ( "дисплея")
String dispFieldText = parent.displayField.getText ();
// Отримати напис на кнопці
String clickedButtonLabel = clickedButton.getText ();
Коли ви оголошуєте змінну для зберігання посилання на екземпляр якого -? Або класу, ця змінна повинна мати, або тип цього класу, або тип одного з його суперкласів.
Будь-клас в Java походить від класу Object, і якщо, наприклад, клас Fish - це спадкоємець класу Pet, то кожна з цих рядків правильна:
Fish myFish = new Fish (); Pet myFish = new Fish ();
Object myFish = new Fish ();
Доробляємо калькулятор Давайте визначимося з декількома правилами (з алгоритмом), заяким повинен працювати наш калькулятор:
1. Спочатку користувач вводить всі цифри першого чісла.2. Якщо користувач натисне яку -? Небудь з кнопок арифметичного дії +, -. / Or *. то треба зберегти перше число і обрану дію в полях класу, і стерти число з дисплея калькулятора.3. Потім користувач вводить друге число і натискає кнопкуравно. 4. Здійснити конвертацію строкове значення з дисплея в числовий тип double, щоб мати можливість зберігати великі дробові числа. Провести арифметичну дію за допомогою обраного дії і першого числа, збережених в кроці 2.
5. Показати результат кроку 4 на дисплеї калькулятора і сохранітьето значення в змінній, яка використовувалася в кроці 2.
import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton;
char selectedAction = ''; // +, -, /, або *
double currentResult = 0;
// Конструктор зберігає посилання на вікно калькулятора
// в змінної примірника класу
this .parent = parent;
public void actionPerformed (ActionEvent e)
// Отримати джерело дії
JButton clickedButton = (JButton) e.getSource (); String dispFieldText = parent.displayField.getText (); double displayValue = 0;
// Отримати число з дисплея калькулятора,
// якщо він не порожній.
// Знак оклику - це оператор заперечення
Object src = e.getSource ();
// Для кожної кнопки арифметичної дії
// запам'ятати його: +, -, /, або *, зберегти поточне число
// в змінної currentResult, і очистити дисплей
// для введення нового числа
if (src == parent.buttonPlus)
selectedAction = '+'; currentResult = displayValue; parent.displayField.setText ( "");
> Else if (src == parent.buttonMinus)
selectedAction = '-'; currentResult = displayValue; parent.displayField.setText ( "");
> Else if (src == parent.buttonDivide)
selectedAction = '/'; currentResult = displayValue; parent.displayField.setText ( "");
> Else if (src == parent.buttonMultiply)
selectedAction = '*'; currentResult = displayValue; parent.displayField.setText ( "");
> Else if (src == parent.buttonEqual)
// Здійснити арифметична дія, в залежності
// від selectedAction, оновити змінну currentResult
// і показати результат на дисплеї
// конвертацію результат в рядок, додаючи його
// до порожньому рядку і показати його
> Else if (selectedAction == '-')
> Else if (selectedAction == '/')
> Else if (selectedAction == '*')
// Для всіх цифрових кнопок приєднати напис на
// кнопці до напису в дисплеї
String clickedButtonLabel = clickedButton.getText ();
Наша заключна версія вікна калькулятора буде виглядати как--?
Клас Calculator робить такі дії:
Створює і показує все компоненти вікна. Створює екземпляр слухача CalculatorEngine. Передає CalculatorEngine посилання на себе. Реєструє цього слухача у всіх компонентах, які створюють події.
Ось остання версія класу Calculator:
public class Calculator
// Оголошуємо і инициализируем компоненти вікна
JButton button0 = new JButton ( "0"); JButton button1 = new JButton ( "1"); JButton button2 = new JButton ( "2");
JButton button3 = new JButton ( "3"); JButton button4 = new JButton ( "4"); JButton button5 = new JButton ( "5"); JButton button6 = new JButton ( "6"); JButton button7 = new JButton ( "7"); JButton button8 = new JButton ( "8"); JButton button9 = new JButton ( "9"); JButton buttonPoint = new JButton ( "."); JButton buttonEqual = new JButton ( "=");
JButton buttonPlus = new JButton ( "+"); JButton buttonMinus = new JButton ( "-"); JButton buttonDivide = new JButton ( "/"); JButton buttonMultiply = new JButton ( "*");
JPanel windowContent = new JPanel (); JTextField displayField = new JTextField (30);
// Установити менеджер розташування для панелі
BorderLayout bl = new BorderLayout ();
// Додаємо дисплей у верхній частині вікна
// Створюємо панель з менеджером розташування GridLayout
// в якій буде 12 кнопок - 10 цифр, і
// кнопки "точка" і "дорівнює"
JPanel p1 = new JPanel ();
GridLayout gl = new GridLayout (4,3);
p1.setLayout (gl); 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 в центр вікна
// Створюємо панель з менеджером розташування GridLayout
// на якій буде 4 кнопки -
// Плюс, Мінус, Розділити і Помножити
JPanel p2 = new JPanel ();
GridLayout gl2 = new GridLayout (4,1);
p2.setLayout (gl2); p2.add (buttonPlus); p2.add (buttonMinus); p2.add (buttonMultiply); p2.add (buttonDivide);
// Додаємо панель p2 в праву частину вікна
// Створюємо frame і додаємо в нього вміст JFrame frame = new JFrame ( "Calculator");
// Встановлюємо розмір вікна, так щоб вмістилися
// Створюємо примірник слухача подій і
// реєструємо його в кожній кнопці
CalculatorEngine calcEngine = new CalculatorEngine (this);
button0.addActionListener (calcEngine); button1.addActionListener (calcEngine); button2.addActionListener (calcEngine); button3.addActionListener (calcEngine); button4.addActionListener (calcEngine); button5.addActionListener (calcEngine); button6.addActionListener (calcEngine); button7.addActionListener (calcEngine); button8.addActionListener (calcEngine); button9.addActionListener (calcEngine);
buttonPoint.addActionListener (calcEngine); buttonPlus.addActionListener (calcEngine); buttonMinus.addActionListener (calcEngine); buttonDivide.addActionListener (calcEngine); buttonMultiply.addActionListener (calcEngine); buttonEqual.addActionListener (calcEngine);
public static void main (String [] args)
// Створюємо екземпляр класу "Калькулятор" Calculator calc = new Calculator ();
Тепер скомпілюємо проект і запустимо клас Calculator. Вона працює майже так само, як і справжні калькулятори. Вітаю! Це ваша перша програма, яка може стати в нагоді багатьом людям - подаруйте її своїм друзям.
Для того, щоб краще розуміти, як працює ця програма, я рекомендую вам освоїти налагодження програм. Будь ласка, прочитайте Додаток А про відладчик Eclipse, а потім продовжуйте читання
Джерело: Java Programming for Kids, Parents and Grandparents by Yakov Fain