我的javafx应用中有一个TableView
和一些TextBox
和ComboBox
的表单。我正在尝试使用TableView
中选定的行数据填充表单组件。我可以填充所有TextBox
而不会出现任何错误或异常。但是,在将值设置为ComboBox
时,它会抛出ClassCastException
,java.lang.ClassCastException: java.lang.String cannot be cast to entity.StockUOM
。
这是我的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
ChangeListner
的实例,正在监听TableView
行选择。
那我在做什么错了?什么是解决方案。
感谢。
答案 0 :(得分: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声明为ComboBox<StockUOM> unitCombo = new ComboBox<StockUOM>();
。在此之后,您将在为String值设置值的行上出现编译时错误,以修复您必须将该行修改为unitCombo.setValue(newValue);
的错误。如果要显示String对象,则方法是相同的。