2017-05-06 64 views
0

我目前正在用JavaFX和FXML编写一个程序。我目前的问题是,我有一个FXMLTableView,它应该显示两个不同的对象类StockorderArticle的特征,即文章的名称,ID和价格以及该文章有多少库存(这是在库存中定义的)。目前,我有以下代码:JavaFX Tableview持有两种对象

Stockorder:

public class Stockorder { 

    private SimpleStringProperty deliveryState; 
    private SimpleStringProperty stockOrderId; 
    private SimpleStringProperty orderdate; 
    private SimpleStringProperty deliverydate; 
    private SimpleStringProperty count; 
    private SimpleStringProperty itemId; 
    private SimpleStringProperty itemName; 

    public Stockorder(String deliveryState, String stockOrderId, String orderdate, String deliverydate, String count, String itemId, String itemName) { 
     this.deliveryState = new SimpleStringProperty(deliveryState); 
     this.stockOrderId = new SimpleStringProperty(stockOrderId); 
     this.orderdate = new SimpleStringProperty(orderdate); 
     this.deliverydate = new SimpleStringProperty(deliverydate); 
     this.count = new SimpleStringProperty(count); 
     this.itemId = new SimpleStringProperty(itemId); 
     this.itemName = new SimpleStringProperty(itemName); 
    } 

    public boolean getDeliveryState() { 
     return Boolean.valueOf(deliveryState.get()); 
    } 

    public StringProperty getDeliveryStateProperty() { 
     return deliveryState; 
    } 

    public int getStockOrderId() { 
     return Integer.parseInt(stockOrderId.get()); 
    } 

    public StringProperty getStockOrderIdProperty() { 
     return stockOrderId; 
    } 

    public String getOrderdate() { 
     return orderdate.get(); 
    } 

    public StringProperty getOrderdateProperty() { 
     return orderdate; 
    } 

    public String getDeliverydate() { 
     return deliverydate.get(); 
    } 

    public StringProperty getDeliverydateProperty() { 
     return deliverydate; 
    } 

    public int getCount() { 
     return Integer.parseInt(count.get()); 
    } 

    public StringProperty getCountProperty() { 
     return count; 
    } 

    public int getItemId() { 
     return Integer.parseInt(itemId.get()); 
    } 

    public StringProperty getItemIdProperty() { 
     return itemId; 
    } 

    public String getItemName() { 
     return itemName.get(); 
    } 

    public StringProperty getItemNameProperty() { 
     return itemName; 
    } 
} 

文章:

public class Article { 
    private final SimpleStringProperty articleNr; 
    private final SimpleStringProperty name; 
    private final SimpleStringProperty price; 

    public Article(String articleNr, String name, String price) { 
     this.articleNr = new SimpleStringProperty(articleNr); 
     this.name = new SimpleStringProperty(name); 
     this.price = new SimpleStringProperty(price); 
    } 

    public int getArticleNr() { 
     return Integer.parseInt(articleNr.get()); 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public double getPrice() { 
     return Double.parseDouble(price.get()); 
    } 

    public StringProperty getArticleNrProperty(){ 
     return articleNr; 
    } 

    public StringProperty getNameProperty(){ 
     return name; 
    } 

    public StringProperty getPriceProperty(){ 
     return price; 
    } 
} 

EditArticleOverviewControl(FXMLController)

public class EditArticlesOverviewController implements Initializable { 

    public EditArticlesOverviewController() { 
     System.out.println("EditArticleOverviewController started"); 

    } 

    private ApplicationControl applicationControl; 
    private EditOrderController editOrderController = new EditOrderController(); 
    private String stockOrderURL = "stockorders"; 
    private HttpClient client = new HttpClient(); 

    @FXML 
    TableView<Article> tableView; 

    @FXML 
    TableColumn<Article, String> articleNrColumn; 

    @FXML 
    TableColumn<Article, String> nameColumn; 

    @FXML 
    TableColumn<Article, String> priceColumn; 

    @FXML 
    TableColumn<Stockorder, String> stockColumn; 

    @FXML 
    TableColumn<Stockorder, String> minStockColumn; 

    @FXML 
    TableColumn<Stockorder, String> addColumn; 

    @FXML 
    Button cancelButton; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     articleNrColumn.setCellValueFactory(cellData -> cellData.getValue().getArticleNrProperty()); 
     nameColumn.setCellValueFactory(cellData -> cellData.getValue().getNameProperty()); 
     priceColumn.setCellValueFactory(cellData -> cellData.getValue().getPriceProperty()); 
     stockColumn.setCellValueFactory(cellData -> cellData.getValue().getCountProperty()); 
     minStockColumn.setCellValueFactory(cellData -> cellData.getValue().getDeliveryStateProperty()); 
     addColumn.setCellValueFactory(cellData -> cellData.getValue().getCountProperty()); 
    } 

    public void setApplicationControl(ApplicationControl applicationControl) { 
     this.applicationControl = applicationControl; 
    } 

    public void setEntriesInTableView(ObservableList articlesList) { 
     tableView.setItems(articlesList); 
    } 

    @FXML 
    public void goBack() { 
     System.out.println("Kein Artikel bearbeitet"); 
     Stage stage = (Stage) cancelButton.getScene().getWindow(); 
     stage.close(); 
     //EditOrder wieder starten vom selben Order wie vorher!! 
     try { 
      applicationControl.openEditOrder(applicationControl.order.getOrderNr()); 
     } catch (Exception ex) { 
      Logger.getLogger(OrdersOverviewController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

现在每次我尝试运行该程序,我收到错误:

java.lang.ClassCastException: client.Article cannot be cast to client.Stockorder 

在我设定的cellValueFactorystockOrder。但我不明白为什么,因为列保持StockordercellValueFactory使用Stockorder类的方法。

+0

你能指点线吗? –

+0

stockColumn.setCellValueFactory(cellData - > cellData.getValue()。getCountProperty()); 那一个。 ** EditArticlesOverviewController *类中的第四个“setCellValueFactory”类 –

回答

0

在你的代码,

TableColumn<Stockorder, String> stockColumn; 

这意味着stockColumn将努力让项目为StockorderTableColumn<S, T>的S影响setCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value)的S和返回类型S TableColumn.CellDataFeatures<S,T>::getValue()

但实际上,TableView中的项目不是Stockorder的实例,因此在运行时会引发ClassCastException。所有S型TableView<S>TableColumn<S,T>必须相同。

在这种情况下,要在TableView中显示它们,需要创建一个数据模型类来使用它。例如:

class RowData { 
    private Stockorder stockorder; 
    private Article article; 
    public RowData(Arthicle article, Stockorder stockorder) { 
     this.article = article; 
     this.stockorder = stockorder; 
    } 
    public Stockorder getStockorder(){ return stockorder; } 
    public Article getArticle(){ return arthicle; } 
} 
+0

然后是TableView和所有TableColumns中的将是RowData? 该方法将''[...] - > cellData.getValue()。getStockorder()。getCountProperty());'? –

+0

这是正确的:) – monolith52

+0

好吧,非常感谢!我可能会尝试将两个TableView压缩到FXML中作为第一次尝试,因为有很多其他的东西需要改变才能使RowData类工作,因为这个类只是一个更大的一小块项目:) –