2017-01-09 46 views
1

我有一個TableView,並在我的JavaFX應用程序的一些TextBoxComboBox一種形式。我正在嘗試使用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()); 

這裏newValueStockUOM實例Ø f ChangeListner正在收聽TableView行選擇。

那麼我在做什麼錯?那有什麼解決方案。

謝謝。

+0

解決此問題的第一件事是停止使用原始類型。即在你的控制器,不聲明'@FXML私人的ComboBox unitCombo;''但私人@FXML組合框 unitCombo;',其中'SomeType'是在組合框中(大概'StockUOM')中顯示的對象的類型。然後(大部分)編譯器會強制你使用正確的類型。 –

+0

非常感謝@James_D。這是我搞砸了。其實我的'TableView'('TableView ')與ComboBox'('ComboBox ')類型不同。所以首先我把組合框聲明爲'ComboBox ',然後在'TableView的ChangeListener'中設置'ComboxBox '的值爲'unitCombo.setValue(new StockUOM(newValue.getUnit()));'和這解決了我的問題。再一次非常感謝你。 – Nazim

+0

這和昨天我的回答完全一樣:) – DVarga

回答

0

的問題是,最有可能你定義你的ComboBox這樣的:

ComboBox unitCombo = new ComboBox(); 

所以你錯過來定義通用的說法和你結束了原始類型(您的IDE最有可能爲您提供了這樣的警告線)。

在這一點上它沒有指定你想在ComboBox顯示什麼樣的對象。

當你做到以下幾點:

unitCombo.setValue(newValue.getUnit()); 

您設置的valueProperty爲字符串值。

然後就是你的轉換器:

unitCombo.setConverter(new StringConverter<StockUOM>() { 
    @Override 
    public String toString(StockUOM object) { 
     return object.getStockUOM(); 
    } 

    @Override 
    public StockUOM fromString(String string) { 
     return null; 
    } 
}); 

其預計顯示StockUOM對象,這並不因此發生了錯誤。

您必須決定要顯示哪種對象:如果它是StockUOM,則將組合框聲明爲ComboBox<StockUOM> unitCombo = new ComboBox<StockUOM>();。在此之後,您將在設置字符串值的行上出現編譯時錯誤,要修復該錯誤,您必須將該行修改爲unitCombo.setValue(newValue);。如果你想顯示字符串對象,方法是相同的。

+0

@DVagra我正在使用fxml。所以我只是在我的控制器中注入組合框。即使我將組合框聲明爲非fxml組件,然後像設置值一樣設置值,就像這個'unitCombo.setValue(newValue);'一樣,它將如何從'StockUOM'獲取特定值,因爲它有多個值。我必須爲我的組合框設置一個「String」值。這個值我必須從上面提到的'TableView'的實體類中獲取。 – Nazim

+0

你完全不清楚你想達到什麼目的。上面描述了問題的解釋。什麼是'newValue.getUnit()'?您想要顯示的值?要麼?什麼是'newValue'?根據您提供的信息,我能做的最好的是告訴您問題來自哪裏。 – DVarga