JavaFX 2中的组合框选择项

时间:2013-08-09 12:29:37

标签: select combobox 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”

5 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:12)

几个月前的问题,但这里是针对此类问题的更优雅的解决方案。

修改CountryObj课程并覆盖hashCodeequals功能,如下所示:

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 :(得分:8)

我认为最简单的解决方案是编写一个 autoSelect 函数,在ObservableList中找到匹配的 CountryObj 。找到正确的 CountryObj 后,告诉组合框将其设置为其值。它应该看起来像这样......

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

修改

这可以进一步重构为具有不同类型参数的所有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));

答案 3 :(得分:2)

如果两个comboBox来自同一个数组,汇编列一和二,那么它们具有相同的序列。然后你可以使用索引。

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

“美国”指数位置1“美国”也在指数位置1上,然后:

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

答案 4 :(得分:0)

Brendan和Branislav Lazic的解决方案很完美,但我们仍然可以改进对autoSelectComboBoxValue方法的调用:

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

:)