2014-09-04 3 views
0

AbstractButton определяет метод addActionListener. JButton и несколько других общих классов наследуют его.Почему JCombobox не является подклассом AbstractButton?

Я вхожу в такое положение, когда хочу написать метод, который принимает массив объектов, поддерживающий addActionListener, принимает ActionListener и добавляет прослушиватель действий ко всем этим объектам. Поэтому я написал метод, как так:

private void addActionListener(ActionListener listener, AbstractButton... buttons){ 
    for(AbstractButton button : buttons) 
     button.addActionListener(listener); 
} 

Однако некоторые из этих объектов, которые я пытаюсь передать в этом методе, являются JCombobox экземпляров. У них есть метод addActionListener, который делает именно то, что он делает в подклассах AbstractButton. Но по какой-то причине JCombobox не наследует от AbstractButton.

Это заставляет меня использовать шаблон Adapter, чтобы обернуть несовместимые JCombobox эс в объекты, которые наследуют AbstractButton:

private static class ComboBoxListenableAdapter extends AbstractButton { 
    JComboBox combobox; 
    public ComboBoxListenableAdapter (JComboBox combobox){ 
     this.combobox = combobox; 
    } 
    public void addActionListener(ActionListener listener){ 
     combobox.addActionListener(listener); 
    } 
} 

Мой вопрос: почему не JCombobox наследует AbstractButton? Разве это не имеет смысла?

+0

Почему combobox наследует поведение кнопки? Они оба принимают «ActionListner», да, но еще? – Tom

+0

Итак, по крайней мере, поскольку слушатели действий являются фундаментальной концепцией в графическом интерфейсе, почему примечание делает интерфейс «Listenable» и реализует несколько классов? Я не знаю, просто кажется странным. –

+0

Потому что это не имеет смысла для этого. JComboBox - это не кнопка, она не разделяет многие требования к состоянию кнопки – MadProgrammer

ответ

2

Поскольку JComboBox не является абстрактным элементом. Теперь, возможно, имело смысл сделать как AbstractButton, так и JComboBox как некоторый интерфейс, определенный как ActionListenerAccepter, или что-то в этом роде, но это было не так, как были определены два класса.

Предполагая, что вы хотите решение одного метода (если не использовать перегруженные методы, как предлагается), я бы просто использовал instanceof в этом случае, чтобы ваш код был прост (избегая чего-то подобного этого адаптера).

private void addActionListener(ActionListener listener, 
      JComponent... possibleActionListenerComponents) 
{ 
    for(JComponent c : possibleActionListenerComponents) 
     if (c instanceof AbstractButton) 
      ((AbstractButton)c).addActionListener(listener); 
     else if (c instanceof JComboBox) 
      ((JComboBox)c).addActionListener(listener); 
} 
+1

Ну, я думаю, это только я, но я бы предпочел перегруженные методы, которые принимают разные подтипы 'JComponent', вместо того, чтобы проверять их и выполнять их на каждой итерации. – Tom

+0

@ Тома. Это лучший подход, но я под впечатлением. Прог хотел решения одного метода. – NESPowerGlove

+0

@NESPowerGlove И я хочу пони, мы не всегда получаем то, что хотим;) – MadProgrammer

Смежные вопросы