Java Swing: как удалить анонимный ActionListener из компонента - PullRequest
11 голосов
/ 29 октября 2010

Я создал массив JButtons с анонимным ActionListeners и при определенных условиях я хочу удалить все ActionListeners, но метод .removeActionListeners требует ActionListener в качестве аргумента. Как бы я удалил слушателей действия?

for (int i=0; i < button.length; i++){
    button[i] = new JButton();
    button[i].addActionListener(listener.new ButtonListener());
}

Ответы [ 3 ]

18 голосов
/ 29 октября 2010

Вы можете получить их с помощью: getActionListeners метод:

for( JButton currentButton: button ) {
    for( ActionListener al : currentButton.getActionListeners() ) {
        currentButton.removeActionListener( al );
    }
}

Я не уверен, если он выдаст ConcurrentModificationException, хотя.

3 голосов
/ 29 октября 2010

Я понимаю ваш вопрос, и, как предлагали другие, итерация всех действий слушателей из клиентского класса может решить вашу непосредственную проблему.

  1. H / w в этом случае, чтовы действительно пытаетесь сделать это расширить функциональность JButton, и это один из способов решения этой проблемы - расширить JButton и добавить метод с именем removeAllActionListeners() (который не принимает никаких параметров).

    • Внутри этого метода вы можете перебирать всех слушателей действий и удалять их.Я думаю, что лучше сделать это, если вы сделаете это здесь, чем в классе клиента.
  2. Если вы не хотите этого делать, то я думаю, что предложение Тома Хотина использоватьхорошая идея в вашем ButtonListener.

  3. В противном случае у вас всегда есть возможность вернуться к «хакерскому» способу - сохранить коллекцию слушателей действий.в вашем клиентском классе.

    • Map<JButton, ButtonListener> (если всегда будет только один слушатель на кнопку), или
    • Map<JButton, List<ButtonListener>> (если может быть несколько слушателей на кнопку) это то, что я мог бы использовать.

Я думаю, что методы 1 и 2 предпочтительнее, а метод 3 указывает на плохой дизайн (но гораздо проще взломать вместе).

Обратите внимание, что, если вы действительно используете метод 1 или что-то подобное, проверьте, что методы или атрибуты являютсядоступ является потокобезопасным (как упомянуто OscarRyz), и если нет, используйте synchronized, чтобы обеспечитьfety.

3 голосов
/ 29 октября 2010

Вы не можете.Никто не имеет ссылки на эти объекты.Чтобы их можно было удалить, вам необходимо сохранить их как элемент данных / переменную в своем коде, а затем передать эту переменную в метод removeActionListener().Однако вы можете использовать метод getActionListeners(), чтобы получить массив всех объектов ActionListener, связанных с Button.Затем вам нужно выяснить, какой из них удалить, но если есть только один, это должно быть легко; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...