W tym momencie rozwijam opartą na adnotacji ramkę wiążącą dla Java Swing, która używa pod maską JGoodies Binding. Niestety utknąłem z adnotacją o wiązaniu JRadioButton. Co chcę zrobić, to określić właściwość-nazwę modelu, który posiada specjalną wartość (wylicza). Przycisk radiowy należy wybrać, jeśli właściwość ma określoną wartość. Teraz chcę, aby określić wartość w adnotacji tak:Czy istnieje sposób zadeklarowania atrybutu adnotacji dla * any * enum?
@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST)
JRadioButton firstButton
@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND)
JRadioButton secondButton
Jednak nie wiem jak deklarować adnotacji, aby umożliwić powyżej dowolny inne wyliczenia, too. Moje pierwsze przypuszczenie było takie, ale nauczyłem się, że atrybuty adnotacji nie mogą być ogólne:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface RadioButtonBinding {
/** The model-property to which the selected value is bound */
String property();
// Idea 1: Specifying the enum class and the enum constant as String - works but is not typesafe
Class<? extends Enum<?>> enumClass();
String enumConstantName();
// Idea 2: Directly specifying the enum constant - gives a compile-time error
<T extends Enum<T>> T enumValue();
}
Jakieś pomysły, jak rozwiązać ten problem?
Wymieniona tutaj adnotacja RadioButtonBinding zawiera dwie idee: Pierwszą z nich jest określenie klasy Enum i stałej String, która będzie z niej korzystać. Ale to oczywiście nie jest bezpieczne i może prowadzić do wyjątków RuntimeException. Po drugie, należy podać wartość wyliczenia bezpośrednio, ale to nie działa. –
btw Zrobiłem dużo tego rodzaju rzeczy z JGoodies, jednym z bardziej nieszczęśliwych czasów, jakie miałem w Javie. Największym problemem jest to, że ma klasę "podstawową", którą rozszerza większość jego innych klas, a więc jego metody mają metodę sygnaturową (podstawową, podstawową, podstawową), gdzie przekazywana musi być "podstawowa" klasa, ale podpis nie daje wskazówek, na jaką konkretną klasę musi być instancja. Część wiązania była dobrym pomysłem, ale nie wsparł go dobrze w tamtym czasie (lata temu) i był niedokończony i tylko udokumentowany w języku niemieckim. –