2013-08-09 1 views
12

У меня есть одна комбо в javaFX, которая заполнена странами.Комбинированный блок выбора в JavaFX 2

Мой объект:

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; 
    } 

}  

Тогда у меня есть наблюдаемый список:

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"));  

Тогда мой комбо. Это имя по стране видно, и я могу иметь код страны для собственного использования:

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()); 
      } 
     } 
    }); 

Как можно автоматически выбрать, например, Германии. Если я знаю только код страны? «DE»

ответ

8

пару месяцев старый вопрос, но здесь более элегантное решение для такого типа задач.

Изменить CountryObj класс и переопределить hashCode и equals функции, как показано ниже:

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; 
    }  
} 

Теперь у вас код, если вы будете выполнять следующее заявление, он автоматически выберет «Германия» для вас.

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

Вы также можете передать объект CountryObj к select методу, описанному выше.

6

Я думаю, что самое простое решение, чтобы написать функцию AUTOSELECT, который находит соответствующий CountryObj в вашем ObservableList. Когда вы найдете правильный CountryObj, скажите combobox, чтобы установить его как его значение. Это должно выглядеть примерно так ...

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

EDIT:

Это может быть дополнительно переработан для многократного использования метода для всех ComboBox'es, которые принимают различные параметры типа:

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); 
     } 
    } 
} 

Func где представляет собой интерфейс:

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

Как применять этот метод:

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

Я имею использовать ваше предложение, и оно работает perfer. Большое спасибо. –

+0

Лучшее решение. –

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

Решение Brendan и Бранислав Лазич совершенен, но мы все еще можем улучшить вызов метода autoSelectComboBoxValue:

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

:)

0

Если оба COMBOBOX из того же массива , сборочный столбец один и два, то они имеют одинаковую последовательность. Затем вы можете использовать индекс.

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

"United States" находится на позиции с индексом 1 "США" также на позиции с индексом 1, то:

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

 Смежные вопросы

  • Нет связанных вопросов^_^