Поддержание OO при использовании слушателей в Java - PullRequest
1 голос
/ 20 сентября 2010

У меня есть код, подобный следующему:

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», которое бы сбрасывало все myButtons, содержащиеся в myPanel.Маршрут, который мне подходит, состоит в том, чтобы использовать instanceof, чтобы увидеть, является ли источник resetButton или myButton, но, похоже, это сильно обескураживает во всем, что я видел.

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

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

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

Для вашей проблемы инкапсуляции, не делайте data публичной. Вместо этого, получите getData() геттер, чтобы получить нужное значение.

Вам не нужно использовать instanceof. Вместо этого установите два разных MouseListener - один для кнопок MyButton и один для кнопок ResetButton. Это можно сделать с помощью внешних классов или закрытого внутреннего класса, который реализует MouseListener. Все кнопки типа MyButton будут иметь один тип слушателя, а сингл ResetButton будет иметь другой тип.

0 голосов
/ 20 сентября 2010

Классы должны начинаться с заглавной буквы (MyButton вместо myButton). Это соглашение.

Поля обычно являются закрытыми, и у вас есть только геттер (myButton.data).

instanceof требуется редко. Вместо этого вы можете определить базовый класс с помощью метода «press». Оба класса могли бы реализовать это.

...