2017-01-09 7 views
1

У меня есть 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 выбор строки.

Так что же я делаю? И какое решение.

Спасибо.

+0

Первое, что нужно сделать, чтобы исправить это, - это прекратить использование необработанных типов. То есть в вашем контроллере не объявляйте '@FXML private ComboBox unitCombo;', но '@FXML private ComboBox unitCombo;', где 'SomeType' - тип объекта, отображаемого в поле со списком (возможно,« StockUOM'). Затем (по большей части) компилятор заставит вас использовать правильные типы. –

+0

Большое спасибо @James_D. Это то, что я испортил. На самом деле мой 'TableView' (' TableView ') имеет другой тип, чем тип' ComboBox' ('ComboBox ').Поэтому сначала я объявил поле со списком как «ComboBox », а затем в 'ChangeListener'' TableView 'i установил значение' ComboxBox 'как' unitCombo.setValue (новый StockUOM (newValue.getUnit()); 'и это решило мою проблему. Еще раз спасибо. – Nazim

+0

И это точно так же, как в моем ответе вчера :) – DVarga

ответ

0

Проблема заключается в том, что, скорее всего, вы определили ваш ComboBox как:

ComboBox unitCombo = new ComboBox(); 

Таким образом, вы пропустили, чтобы определить общий аргумент, и вы в конечном итоге с сырым типом (ваш IDE, скорее всего, дает предупреждение об этом линия).

На данный момент не указано, какие объекты вы хотите отображать в ComboBox.

Когда вы делаете следующее:

unitCombo.setValue(newValue.getUnit()); 

вы установите valueProperty в качестве значения String.

А потом приходит ваш конвертер:

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, то методология будет одинаковой.

+0

@DVagra Я использую fxml. поэтому я просто впрыскиваю combobox в свой контроллер. Даже если я объявляю свой combobox как компонент, отличный от fxml, тогда при настройке значения, как вы сказали, это «unitCombo.setValue (newValue);», как он получит конкретное значение из «StockUOM», поскольку оно имеет более одного значения. Я должен установить значение «String» в поле со списком. Это значение я должен извлечь из класса сущности 'TableView', как я упомянул выше. – Nazim

+0

Непонятно, чего вы хотите достичь. Объяснение проблемы описано выше. Что такое 'newValue.getUnit()'? Значение, которое вы хотите отобразить? Или? Что такое 'newValue'? Основываясь на предоставленной вами информации, я могу лучше всего сказать вам, откуда эта проблема. – DVarga

 Смежные вопросы

  • Нет связанных вопросов^_^