слушатели действий и источники событий в Swing

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

  •  16-09-2019
  •  | 
  •  

Вопрос

Хорошо, так что если я добавлю ActionListener к элементу графического интерфейса, и это Только Элемент, который я использую это ActionListener Имеет ли это значение, какая из следующих строк (A, B) я использую для выбранного состояния флажок?

final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent event){               
            boolean bChecked =
            // (a) checkbox.isSelected();
            // (b) ((JCheckBox)event.getSource()).isSelected();
            model.setPrintDebugOn(bChecked);
        }
});

Это имеет смысл для меня, если я добавлю ActionListener ОБЪЕКТ НА НЕСКОЛЬКО ЭЛЕМЕНТАМИ, тогда я должен использовать (b).

И в (б), нормально ли бросить слепо event.getSource() к JCheckBox, поскольку я тот, кто добавил слушателя действий или должен программировать в обороне и сделать instanceof Проверьте?

примечание: Этот вопрос находится в контексте слушателей событий в целом; У Kdgregorory есть несколько хороших точек ниже, специально Re: Флакторы, которые я пренебрегал.

Это было полезно?

Решение

В (b) быть жестким, вы действительно должны сделать экземпляр проверки, но это не так важно. Я бы подумал, что обе эти строки в порядке и приемлемы, хотя (б) был бы «лучшим кодом»

Хотя то, что обычно делается в слушателе, - это просто вызовать другой метод, настроенный на ваш флажок. Так что это было бы похоже на что -то вроде этого:

 @Override public void actionPerformed(ActionEvent event) {                                  
    //your treatment would be in this method, where it would be acceptable to use (a)                  
    onCheckBoxActionPerformed(event)
}

Другие советы

Я бы ни делал.

Если нажать на флажок начнется какое -то действие, я бы прикрепил ItemListener, затем просто посмотрите на состояние отбора в ItemEvent.

Тем не менее, флажки обычно не вызывают действия, они управляют состоянием. Таким образом, лучшим подходом является изучение всех ваших флажков в ответ на то, что запускает действие.


РЕДАКТИРОВАТЬ: Некоторые комментарии о более крупных вопросах, которые поднял OP.

Во -первых, важно понимать, что большая часть свинга представляет удобство реализации, а не последовательную модель поведения. JCheckbox а также Jbutton не иметь ничего общего, кроме того факта, что щелчок в их пространстве имеет смысл. Однако они оба наследуют от Abstractbutton, который предоставляет детали реализации, такие как метка кнопки. Это также предполагает, что кнопки «нажимают», и что нажатие кнопки инициирует некоторое значимое поведение (действие). Однако в случае JCheckbox нажатие кнопки не важна, изменение состояния. Это изменение состояния сигнализирует ItemListener, который также определяется на AbstractButton, хотя изменения состояния не имеют смысла для других типов кнопок (Javadoc даже говорит «флажок»).

Одна из вещей, которые качались, получила правильно - если трудно в использовании - это идея этого Действие отделен от контроля, инициирующего это действие. Объект действия может быть вызван из нескольких элементов управления: элемент меню, кнопка на диалоге, нажатие на клавиш, что угодно. С точки зрения дизайна более важно то, что он уводит вас от идеи общего «слушателя», которая пытается выяснить, что должно произойти. Я видел приложения, где, например, один слушатель получает ввод со всей системы меню, а затем проходит через большую цепочку if/else, чтобы выяснить, какой элемент меню был нажат. Использование действий означает, что у вас больше классов, но в долгосрочной перспективе дает вам более поддерживаемое приложение.

Наконец, с точки зрения удобства использования, существует разница между элементами управления, которые поддерживают состояние, такими как JCheckbox и JTextArea, и теми, которые инициируют действия, такие как JButton и Jmenuitem. Я видел (веб -) приложение, где нажатие на радиопроизводитель переводит вас на другую страницу. Плохо. Даже если вы планируете использовать слушателей внутренне, чтобы обновить состояние какой -либо модели, вы должны спросить себя, почему коллекция элементов GUI сами по себе не предоставляет вам модель.

Для случая, когда слушатель эксклюзив (например, слушатель Anon), я использую (а).

Если слушатель будет повторно использован (например, this это экземпляр ActionListener) Я напишу это как:

@Override
public void actionPerformed(ActionEvent event) {
    Object src = event.getSource();
    if (src == checkbox) {
        boolean bChecked = checkbox.isSelected();
        // ...
    }
}

Если у вас есть несколько флажков, и они обрабатываются одинаково, тогда instanceof имеет смысл.

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

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