我有一個TableView
,並在我的JavaFX應用程序的一些TextBox
和ComboBox
一種形式。我正在嘗試使用TableView
中的選定行數據填充表單組件。我可以填充所有的TextBox
,沒有任何錯誤或異常。但是,當設置值爲ComboBox
es時,它將投擲ClassCastException
,java.lang.ClassCastException: java.lang.String cannot be cast to entity.StockUOM
。如何解決StringConverter ClassCast異常?
這是我StringCoverter
unitCombo.setConverter(new StringConverter<StockUOM>() {
@Override
public String toString(StockUOM object) {
return object.getStockUOM();
}
@Override
public StockUOM fromString(String string) {
return null;
}
});
這是我entity.StockUOM
類
@Entity
@Access(AccessType.PROPERTY)
@NamedQueries({
@NamedQuery(name = StockUOM.findStockUOM, query = "SELECT s from StockUOM s")
})
public class StockUOM implements Externalizable{
public final static String PREFIX = "entity.StockUOM.";
public final static String findStockUOM = PREFIX + "findStockUOM";
private IntegerProperty id;
private int _id;
private StringProperty stockUOM;
private String _stockUOM;
public StockUOM() {
if (id == null) {
id = new SimpleIntegerProperty(this, "id", _id);
}
if(stockUOM== null){
stockUOM= new SimpleStringProperty(this,"stockUOM",_stockUOM);
}
}
public StockUOM(String stockUOM) {
this();
this.stockUOM.set(stockUOM);
}
public IntegerProperty idProperty() {
if (id == null) {
id = new SimpleIntegerProperty(this, "id", _id);;
}
return id;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public final int getId() {
if (id == null) {
return _id;
} else {
return id.get();
}
}
public final void setId(int id) {
if (this.id == null) {
_id = id;
} else {
this.id.set(id);
}
}
public StringProperty stockUOMProperty() {
if(stockUOM== null){
stockUOM= new SimpleStringProperty(this,"stockUOM",_stockUOM);
}
return stockUOM;
}
public final String getStockUOM() {
if(stockUOM == null){
return _stockUOM;
}else{
return stockUOM.get();
}
}
public void setStockUOM(String stockUOM) {
if (this.stockUOM == null) {
_stockUOM=stockUOM ;
} else {
this.stockUOM.set(stockUOM);
}
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(getId());
out.writeChars(getStockUOM());
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
setId(in.readInt());
setStockUOM((String)in.readObject());
}
@Override
public String toString() {
return getStockUOM();
}
}
我這是怎麼設定值ComboBox
unitCombo.setValue(newValue.getUnit());
這裏newValue
是StockUOM
實例Ø f ChangeListner
正在收聽TableView
行選擇。
那麼我在做什麼錯?那有什麼解決方案。
謝謝。
解決此問題的第一件事是停止使用原始類型。即在你的控制器,不聲明'@FXML私人的ComboBox unitCombo;''但私人@FXML組合框 unitCombo;',其中'SomeType'是在組合框中(大概'StockUOM')中顯示的對象的類型。然後(大部分)編譯器會強制你使用正確的類型。 –
非常感謝@James_D。這是我搞砸了。其實我的'TableView'('TableView')與ComboBox'('ComboBox ')類型不同。所以首先我把組合框聲明爲'ComboBox ',然後在'TableView的ChangeListener'中設置'ComboxBox '的值爲'unitCombo.setValue(new StockUOM(newValue.getUnit()));'和這解決了我的問題。再一次非常感謝你。 –
Nazim
這和昨天我的回答完全一樣:) – DVarga