2017-05-06 3 views
0

J'écris actuellement un programme avec JavaFX et FXML. Mon problème actuel est que j'ai un FXMLTableView, qui devrait afficher les traits de deux classes d'objets différents, Stockorder et Article, à savoir le nom, l'identifiant et le prix de l'article et combien de cet article sont en stock (qui est défini en stockorder). J'ai actuellement le code suivant:JavaFX Tableview contenant deux types d'objets

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; 
    } 
} 

Article:

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); 
     } 
    } 
} 

Maintenant, chaque fois que j'essaie d'exécuter le programme, J'ai l'erreur:

à la ligne où j'ai défini le cellValueFactory pour stockOrder. Mais je ne peux pas comprendre pourquoi, comme la colonne contient Stockorder et cellValueFactory utilise des méthodes de la classe Stockorder.

+0

pouvez-vous pointer la ligne? –

+0

stockColumn.setCellValueFactory (cellData -> cellData.getValue(). GetCountProperty()); Celui-là. La quatrième 'setCellValueFactory' dans la classe ** EditArticlesOverviewController * –

Répondre

0

votre code,

TableColumn<Stockorder, String> stockColumn; 

Cela signifie stockColumn va essayer d'obtenir des éléments comme Stockorder. Le S de TableColumn<S, T> affecte S de setCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value) et renvoie le type S de TableColumn.CellDataFeatures<S,T>::getValue().

Mais en réalité, les éléments du TableView ne sont pas des instances de Stockorder, donc ClassCastException est levé lors de l'exécution. Tous les types S de TableView<S> et TableColumn<S,T> doivent être identiques.

Dans ce cas, pour les afficher dans un TableView, il est nécessaire de créer une classe de modèle de données pour l'utiliser. Par exemple:

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

Et puis le de TableView et tous les TableColumns seraient RowData? Et la méthode serait '[...] -> cellData.getValue(). GetStockorder(). GetCountProperty());'? –

+0

C'est vrai :) – monolith52

+0

Ok, merci beaucoup! Je vais probablement essayer de placer deux tablesViews dans le FXML en premier, car il y a beaucoup d'autres choses que je devrais changer pour faire fonctionner cette classe RowData, car cette classe est juste un petit morceau d'une plus grande projet :) –