JavaFX Tableview 持有两种对象

标签 java javafx tableview fxml classcastexception

我目前正在使用 JavaFX 和 FXML 编写程序。我当前的问题是我有一个 FXMLTableView,它应该显示两个不同对象类 StockorderArticle 的特征,即名称,商品的 ID 和价格以及该商品的库存数量(在 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

在我为 stockOrder 设置 cellValueFactory 的行。但我不明白为什么,因为该列保存 Stockorder 并且 cellValueFactory 使用 Stockorder 类的方法。

最佳答案

在您的代码中,

TableColumn<Stockorder, String> stockColumn;

这意味着stockColumn将尝试作为库存订单获取商品。 TableColumn<S, T>的S影响 setCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value) 的S并返回类型 S TableColumn.CellDataFeatures<S,T>::getValue() .

但实际上, TableView 中的项目不是 Stockorder 的实例,所以ClassCastException在运行时抛出。 TableView<S>全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; }
}

关于JavaFX Tableview 持有两种对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819845/

相关文章:

java - 在 Java 6u13+ 中从 Java WebStart (JNLP) 启动浏览器窗口

java - 水平滚动条隐藏 TableView 中的最后一行 (JavaFX)

json - 在 TableView 中显示 JSON

ios - 用 Swift 语言显示 webImages 的 UITableView 似乎卡住了

ios - 重新加载部分时 tableview 标题 uiview 消失

java - 当bean类的字段结构周期性变化时,如何反序列化同一个bean类的不同版本?

java - 如何根据标点符号和空格拆分字符串?

java - 代码风格建议放入 "Copyright Statement"

JavaFX 容器可拖动

Javafx TableView 未显示所有列中的数据