Java [Swing] Spezielle JComboBox

#basTi

Commodore Pro
Registriert
Aug. 2005
Beiträge
4.762
Hallo zusammen,

ich benötige momentan eine spezielle funktion für meine JComboBox (editierbar) und weiss nicht genau, wie ich es am besten umsetzen soll.

Folgendes ist gewünscht:
Ich habe in der ComboBox eine Liste von Objekten (Beinhaltet einen Double Wert & eine String Beschreibung),
welche durch ihre toString-Methode in der Liste auftauchen ( double + " : " + string).
Nun will ich aber, dass in das Textfeld nur Double zahlen eingeben werden können UND wenn ich ein Item aus der Liste auswähl auch nur das Double eingetragen wird.

Ein Beispiel, damits klarer wird ;) :
Unbenannt.png

Wenn ich nun auf ein Item auf dem Bild klicken würde (zB "1.0 : ein") wird nur das "1.0" ins Textfeld übernommen (optimalerweise auch als Double und nicht als String).

Ich habe beim arbeiten mit Tabellen (JTable) schon etwas gefunden, was ich sehr gut gebrauchen könnte, und zwar wenn man ein eigenes TableModel angibt und eine Spalte als "Double" kennzeichnet kann man in dieses textfeld nur Doubles eintragen (falsche eingaben werden rot umrandet und nicht akzeptiert) und richtige eingaben auch als Double zurückgegeben. Beispiel hierfür (nur in dem Fall mit Integers): Oracle.com Beispiel (in das "# of Years" Feld können nur Integers eingegeben werden)
Wär also sehr pratkisch dieses Textfeld irgenwie zu bekommen und zu benutzen ... nur ich finds nicht :D

Schonmal danke für eure hilfe :)
 
Ich weiß nicht, ob ich das jetzt trotz deiner Beschreibung richtig verstanden habe.

Du kannst ja die Methode getSelectedItem() überschreiben.

Hier mal in einem kleinen fixen Beispiel zusammengebaut. Nicht schön, aber ich glaub das willst du haben.^^
Ob du es jetzt noch in Double umwandelst oder nicht, musst du dann selbst wissen und schaffst du ja sicherlich auch alleine. :)
Code:
package test;

import javax.swing.JComboBox;
import javax.swing.JFrame;

public class Main extends JFrame {

   public static void main(String[] args) {

      Main m = new Main();

   }

   public Main() {
      this.setSize(200, 200);
      init();
      this.setVisible(true);
   }

   private void init() {
      JComboBox jcb = new JComboBox() {
         public Object getSelectedItem() {
            Object o = super.getSelectedItem();

            String str = (String)o;

            str = str.substring(0, str.indexOf(':'));

            return (Object)str;
         }
      };
      jcb.addItem("1.0 : Test");
      jcb.addItem("2.0 : Test");
      jcb.addItem("3.0 : Test");
      jcb.addItem("4.0 : Test");

      this.add(jcb);
   }

}

Wenn du nur doubles hinzufügen willst, dann überschreibst du die Methode(n) zur Eingabe und überprüft vorher, ob es ne gültige double sein kann. Wenn nicht, dann meldest du nen Fehler oder so und wenn ja, dann addest du sie ganz normal.
Ergänzung ()

ps: Ich weiß ja nicht, wie deine Strings aussehen, aber als kleiner Hinweis (was in meinen Beispiel auch fehlt), du musst aufpassen, wenn dein String gar nicht : enthält oder so. Weil indexOf dir dann -1 zurückgibt und man kein Substring von 0 bis -1 machen kann, d.h. du bekommst eine Exception.

Daher solltest du dem Benutzer vertrauen(:freak:) oder das wirklich richtig absichern.
 
Zuletzt bearbeitet:
Schon einmal vielen dank. Das scheint zu funktionieren (angepasst). Trotzdem frage ich mich, wo diese Standard JTextField Komponente vom JTable ist, welche sich schon komplett um das "Error-Handling" kümmert (falsche eingaben -> rot einfärben etc). Diese zu verwenden würde Arbeit ersparen (Hab schon herausgefunden, dass es mit org.jdesktop.swingx.table.NumberEditorExt zu tun hat).


Zudem bekomme ich grade weitere Probleme:
Zuerst die Information, dass diese JComboBox als TableCellEditor benutzt wird. Ich habe also einen Custom CellEditor für eine Tabelle, welcher folgende Methode implementieren muss:
getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
Diese Methode wird mit dem derzeitigen in der Zelle befindlichen Wert (value) aufgerufen und gibt dann die Combobox als Editorkomponente zurück.
Mein Problem: Ich kann bei der ComboBox nicht den aktuellen Wert beim aufruf setzen:
Code:
combo.setSelectedItem(value); //Sollte den aktuellen Wert für die ComboBox übernehmen
System.out.println("Test: " + combo.getSelectedItem() + " - Value: " +value);  
//Output: Test: null - Value: 40.0
 
Du bekommst nur null zurück, wenn deine JCombobox leer ist (oder man null reinschreibt^^). Dann machst du davor etwas falsch.
 
hmmmm .... ich poste mal den ganzen Code der Methode. Vielleicht bin ich grad Arbeitsblind :)

Code:
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		
	combo.removeAllItems();
		
	JXTreeTable treeTable = (JXTreeTable)table;
	Command com = (Command)treeTable.getModel().getValueAt(row, treeTable.getHierarchicalColumn()+1);
	AvailableCommand acom = com.getAvailableCommand();
	Boolean hasItems = false;
	if(acom.hasNumParam()){
		for(IParameter p : acom.getNumParamList()){
			if(p instanceof NumberParameter){
				combo.addItem(p);
				hasItems = true;
			}
		}
	}
	if (hasItems) {
		combo.setSelectedItem(value);
		System.out.println("test for select: " + combo.getSelectedItem() + " - Value: " +value);
		return combo;
	}else{
		...
	}
Ich denke das sollte so Verständlich sein auch wenn nicht alle Klassen bekannt sind :)
Wär über Hilfe sehr dankbar :)
 
Lass dir mal p ausgeben, den wie gesagt, schreibst du null rein, kommt auch nur null raus.
 
Laut meiner Logik kann "p instanceof XY" nie true werden wenn p null ist oder? ;)
Die Elemente sind auch alle drin ... das Problem ist nur, dass ich den alten Wert nicht in den Editor krieg.
 
Zuletzt bearbeitet:
Stimmt stimmt, Galileo läuft im Hintergrund, das verblödet :D

Dann geh doch mal dem Umweg. Du addest den Value richtig.


Code:
deineComboBox.insertItemAt(Object value , 0);
deineComboBox.setSelectedIndex(0);
 
Danke für die antwort ... funktioniert natürlich aber das ist nicht das was ich will.

Hab den Fehler jetzt gefunden
banghead.gif
. Hab ja durch deinen ersten Tipp die getSelectedItem() Methode der ComboBox überschrieben und die wusste nichts mit nem Double anzufangen :freaky:
 
Joar, einfach abfangen, .. if(o instanceof Double) return super.getSelectedItem()

Oder sowas, hätte man auch gleich drauf kommen können! :)
 
Zuletzt bearbeitet: (return vergessen ;<)
Bleibt nurnoch die frage, ob man an dieses standard Textfield mit den Checks ob man Doubles eingibt irgendwie rankommt :) ...
 
Standardmäßig hat doch JTable gar keine ,Selbstüberprüfung'.
Ich kann in meine Integer-Zelle alles reinhauen was ich will.

Oder versteh ich was nicht?
 
Ja, ich merk was du willst. :)
Aber da muss ich für heute passen, aber tut dies nicht eher der TableCellRenderer ?
(Er überprüft was drin steht und malt es dementsprechend, steht was ,,falsches'' drin, dann wird um die Zelle ein roter Rand gemalt).

So stelle ich mir das zumindestens vor und da würde ich auch ansetzen. Wobei ich zugeben muss, dass ich bis jetzt wenig mit JTable zutun hatte und wenn, dann nicht so tief.
 
Zuletzt bearbeitet: (Ach, ich stehe heute neben mir.)
Also ich hab zumindest schon die Komponente bekommen, da ich diese auch verwende, falls in meiner ComboBox keine items sind (der else zweig im obigen Code):
Code:
}else{
	defaultEditor = table.getDefaultEditor(Double.class);
	System.out.println(defaultEditor.getClass());
	//Output: class org.jdesktop.swingx.table.NumberEditorExt
	return defaultEditor.getTableCellEditorComponent(table, value, isSelected, row, column);
}

Nur diese auf den Editor einer ComboBox anzuwenden hab ich noch net hinbekommen :D
 

Ähnliche Themen

Zurück
Oben