2013-08-09 9 views
12

Ho una combinazione in javaFX popolata con paesi.Elemento di selezione della casella combinata in JavaFX 2

Il mio scopo:

public static class CountryObj { 

    private String TCountryDescr; 
    private String TCountryCode;   

    private CountryObj(String CountryDescr,String CountryCode) { 
     this.TCountryDescr = CountryDescr;   
     this.TCountryCode = CountryCode;    
    } 
    public String getTCountryCode() { 
     return TCountryCode; 
    } 
    public void setTCountryCode(String fComp) { 
     TCountryCode= fComp; 
    }   
    public String getTCountryDescr() { 
     return TCountryDescr; 
    } 
    public void setCountryDescr(String fdescr) { 
     TCountryDescr = fdescr; 
    }     
    @Override 
    public String toString() { 
     return TCountryDescr; 
    } 

}  

allora ho la mia lista osservabile:

private final ObservableList<CountryObj> CountrycomboList = 
    FXCollections.observableArrayList(
       new CountryObj ("United States", "US"), 
       new CountryObj ("United Kingdom", "UK"), 
       new CountryObj ("France", "FR"), 
       new CountryObj ("Germany", "DE"));  

Poi il mio combo. Che il nome del paese è visibile e posso avere il codice del paese per il mio uso:

private ComboBox<CountryObj> cCountry1 = new ComboBox<>(); 

cbCountry1.setItems(CountrycomboList); 

cbCountry1.getSelectionModel().selectedItemProperty().addListener(new     ChangeListener<CountryObj>() { 

     @Override 
     public void changed(ObservableValue<? extends CountryObj> arg0, CountryObj arg1, CountryObj arg2) { 
      if (arg2 != null) { 
       System.out.println("Selected Country: " + arg2.getTCountryCode()); 
      } 
     } 
    }); 

Come posso auto-selezionare per esempio la Germania. Se conosco solo il codice del paese? "DE"

risposta

8

paio di mesi vecchia questione, ma qui è più elegante soluzione per questo tipo di problemi.

modificare la classe CountryObj e sovrascrivere i hashCode e equals funzioni come di seguito:

public class CountryObj { 
private String TCountryDescr; 
private String TCountryCode;   

public CountryObj(String CountryDescr,String CountryCode) { 
    this.TCountryDescr = CountryDescr;   
    this.TCountryCode = CountryCode;    
} 
public String getTCountryCode() { 
    return TCountryCode; 
} 
public void setTCountryCode(String fComp) { 
    TCountryCode= fComp; 
}   
public String getTCountryDescr() { 
    return TCountryDescr; 
} 
public void setCountryDescr(String fdescr) { 
    TCountryDescr = fdescr; 
}     
@Override 
public String toString() { 
    return TCountryDescr; 
} 
@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (TCountryCode != null ? TCountryCode.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    String otherTCountryCode = ""; 
    if (object instanceof Country) { 
     otherTCountryCode = ((Country)object).TCountryCode; 
    } else if(object instanceof String){ 
     otherTCountryCode = (String)object; 
    } else { 
     return false; 
    } 

    if ((this.TCountryCode == null && otherTCountryCode != null) || (this.TCountryCode != null && !this.TCountryCode.equals(otherTCountryCode))) { 
     return false; 
    } 
    return true; 
    }  
} 

Ora in voi il codice se si vuole eseguire la seguente istruzione, selezionerà automaticamente "Germania" per voi.

cmbCountry.getSelectionModel().select("DE") 

È possibile anche passare un oggetto di CountryObj per select metodo di cui sopra.

6

Penso che la soluzione più semplice è quello di scrivere una funzione di selezione automatica che trova la corrispondenza CountryObj nel vostro ObservableList. Una volta trovato il CountryObj corretto, dire alla casella combinata di impostarlo come valore. Si dovrebbe apparire qualcosa di simile ...

private void autoSelectCountry(String countryCode) 
{ 
    for (CountryObj countryObj : countryComboList) 
    { 
     if (countryObj.getTCountryCode().equals(countryCode)) 
     { 
      cbCountry1.setValue(countryObj); 
     } 
    } 
} 

EDIT:

Questo può essere ulteriormente riscritta al metodo riutilizzabile per tutti ComboBox'es che prendono diverso tipo di parametro:

public static <T> void autoSelectComboBoxValue(ComboBox<T> comboBox, String value, Func<T, String> f) { 
    for (T t : comboBox.getItems()) { 
     if (f.compare(t, value)) { 
      comboBox.setValue(t); 
     } 
    } 
} 

dove Func è un'interfaccia:

public interface Func<T, V> { 
    boolean compare(T t, V v); 
} 

Come applicare questo metodo:

autoSelectComboBoxValue(comboBox, "Germany", (cmbProp, val) -> cmbProp.getNameOfCountry().equals(val)); 
+0

devo usare la vostra proposta ed è Perfer lavoro. Grazie molto. –

+0

La migliore soluzione finora. –

12
comboBox.getSelectionModel().select(indexOfItem); 
or 
    comboBox.setValue("item1"); 
0

La soluzione di Brendan e Branislav Lazic è perfetto, ma ancora in grado di migliorare la chiamata al metodo autoSelectComboBoxValue:

public static <T, V> void autoSelectComboBoxValue(ComboBox<T> comboBox, V value, Func<T, V> f) {...} 

:)

0

Se entrambi comboBox sono dal medesimo Array , colonna di assemblaggio uno e due, quindi hanno la stessa sequenza. Quindi puoi usare l'indice.

a = comboBox1.getSelectionModel().getSelectedIndex(); 
comboBox2.getSelectionModel().select(a); 

"Stati Uniti" è in posizione di indice 1 "USA" anche sulla posizione di indice 1, allora:

comboBox2.getSelectionModel().select(1); // is "US" 
Problemi correlati