Главная » Java » Приведение типов – casting

0

 В следующем  примере  я  покажу,  как  определить,  какая  кнопка  была нажата,    вызывая  метод  getSource()  класса  ActionEvent. Переменная  evt – это ссылка на объект-­?событие,  который живет где-­?то в  памяти  компьютера. Но,  как  написано  в  документации  Java, метод getSource() возвращает  источник  события  как  экземпляр  типа Object,  который  является  предком  всех  классов  Java,  включая компоненты окна.

Так сделано для того, чтобы этот метод был универсальным, и работал для  любых  компонент.  Но  мы-­?то  знаем  наверняка,  что  в  нашем  окне единственной  причиной такого события могут быть только кнопки! Поэтому  мы  приводим  тип  (we  cast  the  type) возвращаемого Object к типу JButton, размещая тип  в скобках перед именем метода: JButton clickedButton =  (JButton) evt.getSource();

Слева от знака равенства объявлена переменная типа JButton и, хотя метод getSource()  возвращает  данные  типа  Object,  мы  будто говорим  JVM:  Не волнуйся,  я  знаю наверняка,  что  это  –  экземпляр JButton.

 

 Только  после  приведения  типа  Object  к  JButton  нам  разрешаетсявызвать  метод getText(), который принадлежит классу JButton.

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

import javax.swing.JButton;

public class CalculatorEngine implements ActionListener {

public void actionPerformed(ActionEvent e){

// Получаем источник события

JButton clickedButton= (JButton)e.getSource();

// Получаем надпись на кнопке

String clickedButtonLabel = clickedButton.getText();

// Добавляем надпись на кнопке к тексту окна сообщения

JOptionPane.showConfirmDialog(null,"You  pressed " +

clickedButtonLabel,

"Just a test", JOptionPane.PLAIN_MESSAGE);

}

}

Например,  если вы нажмете кнопку “Пять”, то увидите это окносообщения:

Но что, если события окна будут вызываться не только кнопками, но и какими-­?нибудь  другими компонентами? Не всегда  нужно  приводить каждый   объект   к  типу   JButton!   Для   этих   случаев   вы  должны использовать  специальный  оператор  Java,  называемый  instanceof  , чтобы  правильно  сделать  приведение  типа.  Следующий  пример сначала проверяет,  объект  какого типа вызвал событие, а потом делает приведение типа к JButton или к JTextField:public void actionPerformed(ActionEvent evt){ JTextField myDisplayField=null;

JButton clickedButton=null;

Object eventSource = evt.hetSource();

if (eventSource  instanceof JButton){

clickedButton = (JButton) eventSource;

}else if (eventSource  instanceof JTextField){

myDisplayField = (JTextField)eventSource;

}

}

Нашему калькулятору нужно исполнять разные части программы  для разных  кнопок, и следующий пример  показывает, как это сделать.

public void actionPerformed(ActionEvent e){ Object src = e.getSource();

if (src == buttonPlus){

//Здесь должен быть текст программы,складывающий числа

    } else if (src == buttonMinus){

// Здесь должен быть текст программы, вычитающий числа

    }else if (src == buttonDivide){

// Здесь – деление чисел

    } else if (src == buttonMultiply){

// Здесь – текст программы, умножающий числа

}

}

Источник: Java  Programming for Kids, Parents and Grandparents by Yakov Fain

По теме:

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