18

国が設定された[JavaFX] が 1 つComboBoxあります。

私のオブジェクト:

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

それから私は私のものを持っていますObservableList:

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

次に、ComboBox国の名前と国のコードを表示する my は、自分で使用するためのものです。

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」という国のコードしかない場合、ドイツなどの国を自動選択するにはどうすればよいですか?

4

5 に答える 5

16

数か月前の質問ですが、このようなタイプの問題に対するよりエレガントな解決策があります。

以下のようにクラスを変更し、関数と関数を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;
  }    
}

コードで次のステートメントを実行すると、自動的に "Germany" が選択されます。

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

上記のメソッドに CountryObj のオブジェクトを渡すこともできますselect

于 2013-10-31T12:45:28.993 に答える
9

最も簡単な解決策は、ObservableList で一致するCountryObjを見つけるautoSelect関数を作成することだと思います。正しい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));
于 2013-08-09T18:46:38.490 に答える