Компоновщик выберите элемент в JavaFX 2
У меня есть одна комбо в javaFX, которая заполнена странами.
Мой объект:
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"
Ответы
Ответ 1
Несколько месяцев назад вопрос, но вот более элегантное решение для таких проблем.
Измените класс 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
выше.
Ответ 2
comboBox.getSelectionModel().select(indexOfItem);
or
comboBox.setValue("item1");
Ответ 3
Я думаю, что самым простым решением является запись функции 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));
Ответ 4
Решение Brendan и Branislav Lazic отлично, но мы по-прежнему можем улучшить вызов метода autoSelectComboBoxValue:
public static <T, V> void autoSelectComboBoxValue(ComboBox<T> comboBox, V value, Func<T, V> f) {...}
:)
Ответ 5
Если оба comboBox находятся из одного массива, столбец сборки один и два, то они имеют одинаковую последовательность. Затем вы можете использовать индекс.
a = comboBox1.getSelectionModel().getSelectedIndex();
comboBox2.getSelectionModel().select(a);
"Соединенные Штаты" находится в индексной позиции 1 "США" также в позиции индекса 1, затем:
comboBox2.getSelectionModel().select(1); // is "US"