2017-05-06 6 views
0

現在、JavaFXとFXMLを使用してプログラムを作成しています。私の現在の問題は、FXMLTableViewという2つの異なるオブジェクトクラス、すなわちStockorderArticleの特性、つまり記事の名前、ID、価格、およびその記事の在庫数(在庫注文で定義されている)を表示することです。 )。2種類のオブジェクトを保持する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に設定した行にあります。しかし、私はなぜ列がStockorderを保持し、cellValueFactoryStockorderクラスのメソッドを使用するのか理解できません。あなたのコードで

+0

行を指摘できますか? –

+0

stockColumn.setCellValueFactory(cellData - > cellData.getValue()。getCountProperty());それは です。 ** EditArticlesOverviewController *クラスの第4の 'setCellValueFactory' –

答えて

0

TableColumn<Stockorder, String> stockColumn; 

それはstockColumnがStockorderなどの項目を取得しようとすることを意味します。 TableColumn<S, T>のSはsetCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value)のSに、TableColumn.CellDataFeatures<S,T>::getValue()の戻りタイプSに影響します。

実際、TableViewの項目はStockorderのインスタンスではないため、実行時にClassCastExceptionがスローされます。 TableView<S>TableColumn<S,T>のすべてのSタイプは同じでなければなりません。

この場合、それらをTableViewに表示するには、それを使用するためのデータモデルクラスを作成する必要があります。たとえば、

+0

そして、TableViewとすべてのTableColumnのはRowDataですか? メソッドは '[...] - > cellData.getValue()。getStockorder()。getCountProperty());'? –

+0

そうです:) – monolith52

+0

ありがとうございました!私はおそらく、最初の試みとして、2つのTableViewをFXMLにシンプルにしようとします。RowDataクラスを動作させるために変更する必要のあるものがたくさんあるので、このクラスはもっと大きなものですプロジェクト:) –

関連する問題