| 

.NET C# Java Javascript Exception

1
Über den Code:
public class EnumCombo extends JComboBox 
{
setModel(Enum<?> MyEnum){

Enum<?>[] enumArray = MyEnum.values();
setModel(new DefaultComboBoxModel<Enum<?>> (enumArray));
}


verbinde ich die ComboBox mit unterschiedliche Enum Typen. Das funktioniert soweit auch. Aber wie bekomme ich die Warnung: "JCombobox<E> should be parameterized" weg? Ist es möglich statt über das Values Array den EnumTyp direkt generisch an den Konstruktor von DefaultCombobox zu übergeben?
01.04.2015
mobidat 63 1 7
3 Antworten
1
public class EnumCombo extends JComboBox<Enum<?>> {


Oder mit dem Holzhammer @SuppressWarnings (das bekämpft aber nur die Symptome)

Edit: Schmarrn gelöscht, richtiges ergänzt.
02.04.2015
phg 1,6k 3
Enum<?> ist keine Interface Klasse sondern eine offizielle Basisklasse. Die Javadoc zeigt dazu folgende Info:
This is the common base class of all Java language
enumeration types. More information about enums, including descriptions of the implicitly declared methods synthesized by the compiler, can be found in section 8.9 of The Java™ Language Specification.

Trotzdem Dank für die Hilfe!
mobidat 04.04.2015
Ehm, ja da hab ich etwas fundamental verwechselt. :/
Hab meine Antwort eben korrigiert.
phg 04.04.2015
2
Zum Thema "Enum in einer ComboBox" darstellen kann ich lediglich ein paar Empfehlungen geben.

Ein wichtiger Punkt, den man beachten sollte, ist, dass man seine Anwendung durch direktes Binden eines Enums an eine ComboBox zu sehr "hart verdrahten" kann.
Man macht damit ein Oberflächensteuerelement von einem Programmtypen (hier: Enum - gilt aber auch für Klassen und Interfaces) abhängig.

Nehmen wir mal ein Beispiel:
Ein Entwickler benennt ein Enum um (den Typ selbst oder vielleicht ein Wert davon).
Diese Änderung wirkt sich jedoch schlagartig auf die Darstellung der Oberfläche aus.

Oder ein anderes Beispiel:
In einem Enum können die Werte nur durch Begriffe ohne Leerschritte dargestellt werden.
Wenn man zum Beispiel in einer ComboBox den Wert "Keine Auswahl" darstellen möchte, dann kann man in einem Enum höchstens "KeineAuswahl" als Wert definieren.

Manche Entwickler haben sich an dieser Stelle ein Mapping überlegt und das wäre meiner Ansicht nach auch die bessere Vorgehensweise.
Das Mapping sollte jedoch nicht so erfolgen, dass jeder Wert in einem Enum ein Attribut hat, sondern, dass man das Mapping vom Enum auch wirklich trennt.
Zum Beispiel braucht man ein Mapping für die ComboBox ausschließlich an der Oberfläche. Also wäre es empfehlenswert, das Mapping auch nur dort (PresentationLayer) zu platzieren.

So kann man seinen Code am besten aufbereiten, wenn dann mal ein anderer Entwickler dort ran muss ;-)
21.05.2015
Marcus.D 86 1 4
Für Produktiv Code kann ich nur zustimmen. Für eine API Testoberfläche, die sofort auf Änderungen in der Enum Struktur reagieren soll, ist es jedoch hilfreich eine Funktionalität Typ String -> Checkbox Auswahl vorzuhalten. Für den normalen gebrauch wäre bereits die Sprachunabhängigkeit ein Ausschluss - Kriterium. Bei einem Mapping sollte in der Enum eine static Funktion zur Überprüfung der Konsistenz von GUI-Liste und Enum-Tupel integriert werden. Das wäre aber ein extra Thread...
mobidat 22.05.2015
0
Danke PHG!! So kann das Funktionieren. Ich hatte meinen Code abgeändert weil ich ursprünglich mit der XDEV IDE arbeite und dort mit deren proprietären GUI Komponenten arbeite (XdevCombobox).

In Eclipse habe ich jetzt alles nochmal gebaut:
public class MyComboBox extends JComboBox<Enum<?>>{

/**
*
*/
private static final long serialVersionUID = 1L;

void setModel(Enum<?> MyEnum){

Enum<?>[] enumArray = MyEnum.getDeclaringClass().getEnumConstants();
super.setModel(new DefaultComboBoxModel<Enum<?>> (enumArray));
}
}


Das müsste so gehen. Der Hinweis mit der Typisierung der Basisklasse ist korrekt. Leider spielt die abgeleitete XDEVCombo noch nicht mit :-)
07.04.2015
mobidat 63 1 7

Stelle deine Java-Frage jetzt!