Поддержание OO при использовании слушателей в Java
Вопрос
У меня есть код, похожий на следующее:
public class myButton extends JButton()
{
public int data;
public myButton(){
super("asdf");
data = 2;
}
}
public class myPanel extends MouseListener()
{
myButton myButtonVar1;
myButton myButtonVar2;
public myPanel()
{
myButtonVar1 = new myButton();
myPanel.add(myButtonVar1);
myButtonVar1.addMouseListener(this);
myButtonVar2 = new myButton();
myPanel.add(myButtonVar2);
myButtonVar2.addMouseListener(this);
}
//MouseListener Methods are here
void mouseClicked(MouseEvent e)
{
//say this changes the myButton that was clicked data based off
//the other myButton's data
doSomething((myButton)(e.getSource()).data);
}
}
И тогда я добавляю эту панель на JFrame через SetContentPane.
Это работает хорошо. Обработчик должен иметь доступ ко всем кнопкам, потому что ему нужно знать mybuttonvar1.data и mybuttonvar2.data
Эта настройка не сидит прямо со мной, но главная проблема заключается в том, что я должен иметь другие кнопки в кадре, а также доступ к MyButtons.
Итак, как я мог убрать это так, чтобы я мог добавить что-то «ResetButton», который бы сбрасывался всеми мируттонами, содержащимися в MyPanel. Маршрут, который выделяется мне, будет использовать ExstanceOF, чтобы увидеть, является ли источник RestButton или MyButton, но это, кажется, сильно обескуражен во всем, что я видел.
Я надеюсь, что я не слишком далеко здесь. Моя цель состоит в том, чтобы написать хороший код, а не палку с тем, что у меня есть, так дайте мне знать, если бы я сделал что-то принципиально неправильно, и должен вернуться.
Решение
Классы должны начинаться с заглавной буквы (MyButton вместо MyButton). Это конвенция.
Поля, как правило, являются частными, и у вас есть только Getter (MyButton.data).
InstanceOF редко требуется. Вместо этого вы можете определить базовый класс с помощью метода «пресса». Оба класса могут затем реализовать его.
Другие советы
В общем, вы можете решить вашу проблему, предпочитая композицию по наследству. Ваши кнопки не должны быть специальными классовыми кнопками. Вместо этого они должны быть сырыми JButton
с. Вы можете создать класс, который возвращает JButton
С предпочтительными настройками, а также проводит данные, но старайтесь не расширять классы качелей.
Для вашей проблемы с инкапсуляцией не делайте data
общественность. Вместо этого есть getData()
Getter, чтобы получить ценность по мере необходимости.
Вам не нужно использовать экземпляр. Вместо этого установите два разных музелизатора - один для вашего MyButton
кнопки и один для вашего ResetButton
Кнопки. Это может быть сделано с внешними классами или частным внутренним классом, который реализует MouseListener
. Отказ Все MyButton
Кнопки -тып будут иметь один тип слушателя, а один ResetButton
будет иметь другой.