У меня есть TableView
и форма с некоторыми TextBox
и ComboBox
в моем приложении javafx. Я пытаюсь заполнить компоненты формы данными выбранных строк от TableView
. Я могу заполнить все TextBox
без каких-либо ошибок или исключений. Но, установив значения ComboBox
, он бросает 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 private ComboBox unitCombo;', но '@FXML private ComboBox unitCombo;', где 'SomeType' - тип объекта, отображаемого в поле со списком (возможно,« StockUOM'). Затем (по большей части) компилятор заставит вас использовать правильные типы. –
Большое спасибо @James_D. Это то, что я испортил. На самом деле мой 'TableView' (' TableView ') имеет другой тип, чем тип' ComboBox' ('ComboBox ').Поэтому сначала я объявил поле со списком как «ComboBox », а затем в 'ChangeListener'' TableView 'i установил значение' ComboxBox 'как' unitCombo.setValue (новый StockUOM (newValue.getUnit()); 'и это решило мою проблему. Еще раз спасибо. –
Nazim
И это точно так же, как в моем ответе вчера :) – DVarga