AbstractButton
definiuje metodę addActionListener
. JButton
i dziedziczy je kilka innych popularnych klas.
Jestem w pozycji, w której chcę napisać metodę, która pobiera tablicę obsługiwanych obiektów addActionListener
, bierze ActionListener
i dodaje detektor akcji do wszystkich tych obiektów. Więc napisałem taką metodę:
private void addActionListener(ActionListener listener, AbstractButton... buttons){
for(AbstractButton button : buttons)
button.addActionListener(listener);
}
Jednak niektóre z tych obiektów, które próbuję przekazać tą metodą, są JCombobox
instancje. Mają metodę addActionListener
robi dokładnie to, co robi AbstractButton
podklasy. Ale z jakiegoś powodu JCombobox
nie dziedziczy po AbstractButton
.
Zmusza mnie to do użycia wzorca adaptera w celu owinięcia niezgodnego JCombobox
es w obiektach, które dziedziczą AbstractButton
:
private static class ComboBoxListenableAdapter extends AbstractButton {
JComboBox combobox;
public ComboBoxListenableAdapter (JComboBox combobox){
this.combobox = combobox;
}
public void addActionListener(ActionListener listener){
combobox.addActionListener(listener);
}
}
Moje pytanie brzmi: dlaczego nie JCombobox
dziedziczyć AbstractButton
? Czy to nie ma sensu?
Odpowiedzi:
2 dla odpowiedzi № 1Ponieważ JComboBox nie jest AbstractButton. Teraz może mieć sens, aby zarówno AbstractButton, jak i JComboBox były interfejsem zdefiniowanym jako ActionListenerAccepter
lub coś w tym rodzaju, ale to nie był sposób, w jaki zdefiniowano dwie klasy.
Zakładając, że potrzebujesz rozwiązania z jedną metodą(jeśli nie użyję przeciążonych metod, jak sugerowane), po prostu użyję instanceof w tym przypadku, aby twój kod był prosty (unikając czegoś takiego jak ten adapter, który masz).
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);
}