Главная » Java » Как передавать данные между классами

0

 с  цифрой  на  настоящем калькуляторе, он  не  показывает  окно  сообщения,  а  показывает  эту цифру  на  своем  дисплее.  Возникает  задача  –  нам  нужно получить доступ  к  полю  displayField  класса  Calculator  из  метода actionPerformed()   класса CalculatorEngine.  Это  можно  сделать, создав в классе CalculatorEngine переменную, которая будет хранить ссылку на экземпляр объекта Calculator.

В  следующей версии класса CalculatorEngine мы добавим конструктор. У этого  конструктора  будет  один  аргумент  типа  Calculator.  Не удивляйтесь, аргументы у методов могут иметь тип классов, созданных вами!

JVM исполняет конструктор класса CalculatorEngine во  время создания этого  экземпляра в памяти. Класс Calculator  создает CalculatorEngine,  и передает его конструктору ссылку на себя:

CalculatorEngine calcEngine = new CalculatorEngine(this);

Эта ссылка указывает на то место в памяти, где находится экземпляр класса  Calculator. Конструктор CalculatorEngine сохраняет это значение  в  переменной parent,  чтобы  потом  использовать  его  в  методе actionPerformed() для доступа к дисплею калькулятора.

parent.displayField.getText();

parent.displayField.setText(dispFieldText + clickedButtonLabel);

Эти  две строчки были взяты из следующего примера: import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton;

public class CalculatorEngine implements ActionListener { Calculator parent; // ссылка на Calculator

// Конструктор сохраняет ссылку на окно калькулятора

// в переменной класса “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();

parent.displayField.setText(dispFieldText +

clickedButtonLabel);

}

}

Когда вы  объявляете переменную для хранения ссылки на экземпляр какого-­?либо класса,  эта  переменная  должна иметь,  либо  тип  этого класса, либо тип одного из его суперклассов.

Любой  класс  в  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.

Все эти шаги мы  запрограммируем в классе CalculatorEngine. Пока вы будете  читать   следующий   текст   программы, помните,  что метод actionPerformed()  будет  вызываться  после  каждого  нажатия  на кнопку и  данные  между  вызовами  этого  метода  будут  храниться  в переменных selectedAction и currentResult.

import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JButton;

public class CalculatorEngine implements ActionListener { Calculator parent;  //ссылка на окно калькулятора

char selectedAction = ‘ ‘;  // +, -, /, или *

double currentResult =0;

// Конструктор сохраняет ссылку на окно калькулятора

// в переменной экземпляра класса

CalculatorEngine(Calculator parent){

this.parent = parent;

}

public void  actionPerformed(ActionEvent e){

// Получить источник действия

JButton clickedButton =  (JButton) e.getSource(); String dispFieldText=parent.displayField.getText(); double displayValue=0;

// Получить число из дисплея калькулятора,

// если он не пустой.

// Восклицательный знак – это оператор отрицания

if (!"".equals(dispFieldText)){

displayValue= Double.parseDouble(dispFieldText);

}

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

// и показать результат на дисплее

if (selectedAction==’+’){

currentResult+=displayValue;

// Сконвертировать результат в строку, добавляя его

// к пустой строке и показать его

parent.displayField.setText(""+currentResult);

}else if (selectedAction==’-‘){

currentResult -=displayValue;

parent.displayField.setText(""+currentResult);

}else if (selectedAction==’/’){

currentResult /=displayValue;

parent.displayField.setText(""+currentResult);

}else if (selectedAction==’*’){

currentResult*=displayValue;

parent.displayField.setText(""+currentResult);

}

} else{

// Для всех цифровых кнопок присоединить надпись на

// кнопке к надписи в дисплее

String clickedButtonLabel= clickedButton.getText();

parent.displayField.setText(dispFieldText +

clickedButtonLabel);

}

Наша  заключительная версия  окна калькулятора будет выглядеть как-­?

то так:

Класс Calculator делает следующие  действия:

??  Создает  и показывает все компоненты окна.??  Создает  экземпляр слушателя CalculatorEngine.??  Передает CalculatorEngine ссылку на себя.??  Регистрирует этого  слушателя  во  всех компонентах,которые  создают события.

Вот  последняя версия класса Calculator:

import javax.swing.*;

import java.awt.GridLayout;

import java.awt.BorderLayout;

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

// Конструктор

Calculator(){

// Установить менеджер расположения для панели

BorderLayout bl = new BorderLayout();

windowContent.setLayout(bl);

// Добавляем дисплей в верхней части окна

windowContent.add("North",displayField);

// Создаем панель с менеджером расположения 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.add(buttonPoint);

p1.add(buttonEqual);

// Добавляем панель p1 в центр окна

windowContent.add("Center",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 в правую часть окна

windowContent.add("East",p2);

// Создаем frame и добавляем в него содержимое  JFrame frame = new JFrame("Calculator");

frame.setContentPane(windowContent);

// Устанавливаем размер окна, так чтобы уместились

// все компоненты

frame.pack();

// Показываем окно

frame.setVisible(true);

// Создаем экземпляр слушателя событий и

// регистрируем его в каждой кнопке

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

По теме:

  • Комментарии