Поддержание OO при использовании слушателей в Java

StackOverflow https://stackoverflow.com/questions/3754931

  •  04-10-2019
  •  | 
  •  

Вопрос

У меня есть код, похожий на следующее:

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 будет иметь другой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top