2016-07-13 12 views
0

Ich habe Combobox, die mit einigen Elementen gefüllt ist. Jedes Element hat Anzeigeelement und Wert Mitglied:JCombobox Display Text nach Wert

Vector model = new Vector(); 
    model.addElement(new FilterValue("10000 Hz", 0)); 
    model.addElement(new FilterValue("5000 Hz", 1)); 
    model.addElement(new FilterValue("1000 Hz", 5)); 
    model.addElement(new FilterValue("100 Hz", 50)); 
    model.addElement(new FilterValue("10 Hz", 500)); 
    model.addElement(new FilterValue("1 Hz", 5000)); 

public class FilterValue { 
    private final String label; 
    private final int value; 

    public FilterValue(String label, int value) { 
     this.label = label; 
     this.value = value; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public int getValue() { 
     return value; 
    } 

    public String toString() 
    { 
     return label; 
    } 
} 

Initialisierung von JComboBox

cbFilter1 = new JComboBox(model);  
    cbFilter1.setBounds(176, 70, 90, 20);  
    cbFilter1.setSelectedIndex(-1); 
    pnlOUT1.add(cbFilter1); 

    cbFilter1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      JComboBox comboBox = (JComboBox)e.getSource(); 
      FilterValue item = (FilterValue)comboBox.getSelectedItem(); 
      System.out.println(item.getValue() + " : " + item.getLabel()); 
     } 
    }); 

Wenn ich zum Beispiel 5000 Hz wählen, Anzeigetext ist 5000 Hz, und Wert ist 1.

Die Frage ist, wie man den Wert für Beispiel 5 einstellt und 1000 Hz anzeigt?

Ich habe versucht, mit

cbFilter1.setSelectedItem(5); 

Aber es gibt keinen Effekt.

+0

So sollte es sagen 1000Hz oder 5? Du widersprichst dir selbst. Benötigen Sie nur die executes – basic

+0

Dies könnte erreicht werden durch Erstellen einer Methode, die die "FilterValue" -Member der Combo iteriert, wirft sie zurück zu einem 'FilterValue' und überprüft das' value' Attribut. –

+0

'cbFilter1.setBounds (176, 70, 90, 20); 'Java GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). –

Antwort

0

Sie möchten also die Elemente entweder nach ihrem Wert oder nach ihrer Bezeichnung auswählen.

Die erste (und einfachste) Sache, die ich mir vorstellen könnte, um dies zu erreichen, ist ein Map-Objekt mit dem FilterValue als Wert zu erstellen. Mit diesem Mapping können Sie einfach setSelectedItem auf der ComboBox verwenden.

Zuerst kopieren Sie die Elemente aus dem Vektor:

Map<Integer, FilterValue> valueMap = new HashMap<>(); 
Map<String, FilterValue> labelMap = new HashMap<>(); 
model.forEach(filter -> { 
    valueMap.put(filter.getValue(), filter); 
    labelMap.put(filter.getLabel(), filter); 
}); 

Dann sind Sie so etwas wie dieses

String label = "5000 Hz"; 
cbFilter1.setSelectedItem(labelMap.get(label)); 

oder dieses

int value = 5; 
cbFilter1.setSelectedItem(valueMap.get(value)); 

tun könnten Es wird dann Ihre Wahl, wie zu sammeln der Wert (oder Label) des FilterValue (vielleicht ein JTextField oder was auch immer)

0

ändern ausgewähltes Element:

cbFilter1 = new JComboBox(model);  
    cbFilter1.setBounds(176, 70, 90, 20);  
    cbFilter1.setSelectedIndex(5); // EDITED 
    pnlOUT1.add(cbFilter1); 
cbFilter1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     JComboBox comboBox = (JComboBox)e.getSource(); 
     FilterValue item = (FilterValue)comboBox.getSelectedItem(); 
     System.out.println(item.getValue() + " : " + item.getLabel()); 
    } 
}); 
0

So möchten Sie die Auswahl einer Zeile durch einen vorhandenen Wert oder Label vorbei?

Die Methode setSeletedIndex(int index) erwartet ein int entsprechend der Nummer der Zeile (hier von 0 bis 5).

Sie können die Methode verwenden, um das gewünschte FilterValue-Objekt auszuwählen.

Hier ist eine einfache Methode, die Sie wählen Sie die richtige filter Objekt aus einem bestimmten Wert zu helfen:

/* Could do the same for label, using val.getLabel() 
* and passing a String in parameter 
*/ 
public void selectByValue(int value){ 
    FilterValue row = null; 
    for(FilterValue val : model){ //Searching for the corresponding FilterValue 
     if(val.getValue() == value){ 
      row = val; 
     } 
    } 
    cbFilter1.setSelectedItem(row); //Select the corresponding row 
} 

Wenn diese Methode wie diese

this.selectByValue(5); 
Aufruf

Es ist Sache des filter suchen in Ihrem Vector, die den Wert "5" haben und die Zeile dieses Objekts auswählen. Dies erwartet, dass Sie keine Werte zweimal haben, oder es würde das erste auswählen, das angezeigt wird.

getestet und arbeitete;)

Hoffe, es half!

+0

Ich erhalte einen Fehler wie Type mismatch: kann nicht vom Elementtyp Object in myClass.FilterValue konvertieren – Josef

+0

Oh ja, es liegt an deinem Vector-Typ. Sie müssen angeben, dass es sich um einen Vector handelt! ;-) – Kapcash

0

Vielen Dank an alle, ich habe eine Lösung gefunden, die in meinem Fall gut funktioniert:

public static void setSelectedValue(JComboBox comboBox, int value) 
{ 
    FilterValue item; 
    for (int i = 0; i < comboBox.getItemCount(); i++) 
    { 
     item = (FilterValue)comboBox.getItemAt(i); 
     if (item.getValue() == value) 
     { 
      comboBox.setSelectedIndex(i); 
      break; 
     } 
    } 
}