Як передавати дані між класами

з цифрою на цьому калькуляторі, він не показує вікно повідомлення, а показує цю цифру на своєму дисплеї. Виникає запитання - нам потрібно отримати доступ до поля 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