如何解决StringConverter ClassCast异常?

时间:2017-01-09 09:42:05

标签: java string javafx javafx-2 javafx-8

我的javafx应用中有一个TableView和一些TextBoxComboBox的表单。我正在尝试使用TableView中选定的行数据填充表单组件。我可以填充所有TextBox而不会出现任何错误或异常。但是,在将值设置为ComboBox时,它会抛出ClassCastExceptionjava.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()); 

此处newValueStockUOM ChangeListner的实例,正在监听TableView行选择。

那我在做什么错了?什么是解决方案。

感谢。

1 个答案:

答案 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对象,则方法是相同的。