Guten Abend,
Ich möchte einen wiederverwendbaren Dialog programmieren, der abhängig von einer überlieferten Klasse passende JComponents enthält, mit der alle setter und getter der überlieferten Klasse über Reflection manipuliert werden können.
Das funktioniert auch ganz gut, ich stelle per Reflection fest, was der Typ der Eigenschaft ist und nehme dann eine passende JComponent in den Dialog auf.
Z.B. für ein Int einen JSpinner:
Jetzt muss nur der Dialog natürlich, unabhängig davon ob es ein JSpinner, ein JTextField oder ein Button zum Setzen einer java.awt.Color, auf eine Änderung der Werte reagieren. Dummerweise haben JButton, JTextField und JSpinner keine gemeinsame Methode oder gar Listener um auf die Änderungen zu reagieren.
Also will ich die Klassen überschreiben, die alle das selbe Interface implementieren, ganz einfach:
So weit so gut. Im Dialog kann ich nun eine Liste von JComponents halten, und die im Dialog darstellen.
JComponents implementieren natürlich nicht mein schönes Interface.
Ein Valuecomponent kann ich jedoch nicht dem Dialog hinzufügen.
Ich hoffe, ich hab das verständlich ausgedückt.
Mein Versuch sah so aus, ich mache eine JComponent-Klasse, die das Interface implementiert und kann dann button, Spinner oder was auch immer für beide Funktionen benutzen:
Ein eigener JSpinner, der das interface implementiert gilt aber scheinbar nicht als JValueComponent:
die Methode meckert sich entsprechend über "incompatible Types" in Zeile 6.
Bleibt die einzige Möglichkeit 2 Listen zu führen, eine mit JComponents und eine mit den ValueComponent?
Kann da jemand helfen? Wie kann ich sowas realisieren? Oder denke ich grad zu kompliziert?
Ich möchte einen wiederverwendbaren Dialog programmieren, der abhängig von einer überlieferten Klasse passende JComponents enthält, mit der alle setter und getter der überlieferten Klasse über Reflection manipuliert werden können.
Das funktioniert auch ganz gut, ich stelle per Reflection fest, was der Typ der Eigenschaft ist und nehme dann eine passende JComponent in den Dialog auf.
Z.B. für ein Int einen JSpinner:
Java:
public static JComponent getComponent(Class c, Object value){
if (c.isInstance(new Integer(3))){
JSpinner sp = new JSpinner(new SpinnerNumberModel(Integer.parseInt(value.toString()), 0, Integer.MAX_VALUE, 1));
return sp;
}
}
Jetzt muss nur der Dialog natürlich, unabhängig davon ob es ein JSpinner, ein JTextField oder ein Button zum Setzen einer java.awt.Color, auf eine Änderung der Werte reagieren. Dummerweise haben JButton, JTextField und JSpinner keine gemeinsame Methode oder gar Listener um auf die Änderungen zu reagieren.
Also will ich die Klassen überschreiben, die alle das selbe Interface implementieren, ganz einfach:
Java:
public interface ValueComponent {
Object getValue();
void addValueChangeListener(ValueChangeListener l);
}
So weit so gut. Im Dialog kann ich nun eine Liste von JComponents halten, und die im Dialog darstellen.
JComponents implementieren natürlich nicht mein schönes Interface.
Ein Valuecomponent kann ich jedoch nicht dem Dialog hinzufügen.
Ich hoffe, ich hab das verständlich ausgedückt.
Mein Versuch sah so aus, ich mache eine JComponent-Klasse, die das Interface implementiert und kann dann button, Spinner oder was auch immer für beide Funktionen benutzen:
Java:
public class JValueComponent extends JComponent implements ValueComponent {
@Override
public Object getValue() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void addValueChangeListener(ValueChangeListener l) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
Ein eigener JSpinner, der das interface implementiert gilt aber scheinbar nicht als JValueComponent:
Java:
public static JValueComponent getComponent(Class c, Object value){
if (c.isInstance(new Integer(3))){
JValueSpinner sp = new JValueSpinner(new SpinnerNumberModel(Integer.parseInt(value.toString()), 0, Integer.MAX_VALUE, 1));
return sp;
}
}
Bleibt die einzige Möglichkeit 2 Listen zu führen, eine mit JComponents und eine mit den ValueComponent?
Kann da jemand helfen? Wie kann ich sowas realisieren? Oder denke ich grad zu kompliziert?