Пожалуйста, прочитайте javadoc для класса PropertyValueFactory .
Эта строка вашего кода (из класса 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);
}
}
Вот снимок экрана работающего приложения.