为了账号安全,请及时绑定邮箱和手机立即绑定

如何在JavaFX中显示表信息?

如何在JavaFX中显示表信息?

慕森王 2023-11-10 17:13:04
以下代码应该显示库存所有零件可观察列表中的零件。我不确定这是否是库存类未返回正确的对象,或者是否发生了其他情况,或者我在表的初始化中是否遗漏了某些内容。编辑:我期望通过MainViewController initializer.class 加载PartId、PartName、PartStock、 和通过类。InHouse 类扩展了 Part 类PartPriceInventoryobservableList allParts主视图控制器package ViewController;import Model.InHouse;import Model.Inventory;import Model.Part;import Model.Product;import java.io.IOException;import java.net.URL;import java.util.HashSet;import java.util.ResourceBundle;import javafx.collections.ObservableList;import javafx.event.ActionEvent;import javafx.fxml.FXML;import javafx.fxml.FXMLLoader;import javafx.fxml.Initializable;import javafx.scene.Node;import javafx.scene.Parent;import javafx.scene.Scene;import javafx.scene.control.TableColumn;import javafx.scene.control.TableView;import javafx.scene.control.TextField;import javafx.scene.control.cell.PropertyValueFactory;import javafx.stage.Stage;public class MainViewController implements Initializable {    private static Inventory inventory;    //Part FXIDs    @FXML private TableView<Part> PartsTable;    @FXML private TableColumn<Part, Integer> PartId;    @FXML private TableColumn<Part, String> PartName;    @FXML private TableColumn<Part, Integer> PartStock;    @FXML private TableColumn<Part, Double> PartPrice;    //sets up the table view and loads the parts from the inventory list    public void initialize(URL url, ResourceBundle rb) {        PartId.setCellValueFactory(new PropertyValueFactory<>("PartId"));        PartName.setCellValueFactory(new PropertyValueFactory<>("PartName"));        PartStock.setCellValueFactory(new PropertyValueFactory<>("PartStock"));        PartPrice.setCellValueFactory(new PropertyValueFactory<>("PartPrice"));        inventory.addPart(new InHouse(0, "name", 5.00, 1, 1, 5, 0));        PartsTable.setItems(inventory.getAllParts());    }}
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

请阅读PropertyValueFactory类的javadoc。 这行代码(来自类)...
MainViewController

PartId.setCellValueFactory(new PropertyValueFactory<>("PartId"));

意味着您的类Part具有以下声明的方法...

public ObservableValue<Integer> PartIdProperty()

请注意,名称区分大小写。换句话说,partIdProperty正确的。这同样适用于彼此TableColumn。从您发布的代码来看,您的类中似乎缺少这些方法Part

或者,您可以编写自己的Callback接口实现。该接口中方法的声明可能看起来很吓人,但实现起来实际上并不困难。请记住,接口方法是由JavaFX基础结构调用的。使用作为类实例的参数调用您的方法Part,并且您的方法需要返回从方法参数中提取的适当的ObservableValue 。

Part这是一个使用您的类显示零件表的小示例程序。请注意,它使用Java 1.8 中添加的方法引用。另请注意,在下面的代码中,getValue()类中的该方法CellDataFeatures返回一个Part对象。

import javafx.application.Application;

import javafx.beans.property.SimpleDoubleProperty;

import javafx.beans.property.SimpleIntegerProperty;

import javafx.beans.property.SimpleStringProperty;

import javafx.beans.value.ObservableValue;

import javafx.collections.FXCollections;

import javafx.collections.ObservableList;

import javafx.scene.Scene;

import javafx.scene.control.TableColumn;

import javafx.scene.control.TableView;

import javafx.scene.control.TableColumn.CellDataFeatures;

import javafx.scene.layout.BorderPane;

import javafx.stage.Stage;


public class CellValueFactoryExample extends Application {

    private ObservableList<Part> items;


    @Override

    public void init() {

        items = FXCollections.observableArrayList();

        for (int i = 0; i < 10; i++) {

            Part part = new Part(i, String.valueOf(i), (double) i, i, i, i);

            items.add(part);

        }

    }


    @Override

    public void start(Stage primaryStage) throws Exception {

        primaryStage.setTitle("Inventory");

        TableView<Part> table = createTable();

        BorderPane root = new BorderPane();

        root.setCenter(table);

        Scene scene = new Scene(root);

        primaryStage.setScene(scene);

        primaryStage.show();

    }


    private TableView<Part> createTable() {

        TableView<Part> table = new TableView<Part>(items);


        TableColumn<Part, Number> idCol = new TableColumn<>("ID");

        idCol.setCellValueFactory(this::getIdColumnValue);


        TableColumn<Part, String> nameCol = new TableColumn<>("Name");

        nameCol.setCellValueFactory(this::getNameColumnValue);


        TableColumn<Part, Number> priceCol = new TableColumn<>("Price");

        priceCol.setCellValueFactory(this::getPriceColumnValue);


        TableColumn<Part, Number> stockCol = new TableColumn<>("Stock");

        stockCol.setCellValueFactory(this::getStockColumnValue);


        TableColumn<Part, Number> minCol = new TableColumn<>("Min");

        minCol.setCellValueFactory(this::getMinColumnValue);


        TableColumn<Part, Number> maxCol = new TableColumn<>("Max");

        maxCol.setCellValueFactory(this::getMaxColumnValue);


        table.getColumns().addAll(idCol, nameCol, priceCol, stockCol, minCol, maxCol);

        return table;

    }


    private ObservableValue<Number> getIdColumnValue(CellDataFeatures<Part, Number> param) {

        return new SimpleIntegerProperty(param.getValue().getId());

    }


    private ObservableValue<String> getNameColumnValue(CellDataFeatures<Part, String> param) {

        return new SimpleStringProperty(param.getValue().getName());

    }


    private ObservableValue<Number> getPriceColumnValue(CellDataFeatures<Part, Number> param) {

        return new SimpleDoubleProperty(param.getValue().getPrice());

    }


    private ObservableValue<Number> getStockColumnValue(CellDataFeatures<Part, Number> param) {

        return new SimpleIntegerProperty(param.getValue().getStock());

    }


    private ObservableValue<Number> getMinColumnValue(CellDataFeatures<Part, Number> param) {

        return new SimpleIntegerProperty(param.getValue().getMin());

    }


    private ObservableValue<Number> getMaxColumnValue(CellDataFeatures<Part, Number> param) {

        return new SimpleIntegerProperty(param.getValue().getMax());

    }


    public static void main(String[] args) {

        launch(args);

    }

}

这是正在运行的应用程序的屏幕截图。

https://img1.sycdn.imooc.com/654df4470001cce102690299.jpg

查看完整回答
反对 回复 2023-11-10
  • 1 回答
  • 0 关注
  • 60 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信