Как отобразить информацию таблицы в JavaFX? - PullRequest
0 голосов
/ 20 октября 2019

Следующий код должен отображать детали из списка Inventory AllParts Observable. Я не уверен, что этот класс инвентаря не возвращает правильный объект, или что-то еще происходит, или я что-то упускаю при инициализации таблицы.

edit: I'mожидая, что MainViewController initializer загрузит PartId, PartName, PartStock и PartPrice через класс Inventory через observableList allParts. Класс InHouse Расширяет класс Part

MainViewController

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

}

Инвентарь

package Model;

public class Inventory {

    public final static ObservableList<Part> allParts = FXCollections.observableArrayList();

    public void addPart(Part newPart){
        this.allParts.add(newPart);
    }

    public ObservableList<Part> getAllParts(){
        return this.allParts;
    }
}

добавление деталейкласс

public abstract class Part {

    private int id,
            stock,
            min,
            max;
    private String name;
    private double price;

    public Part(int id, String name, double price, int stock, int min, int max) {
        this.id = id;
        this.stock = stock;
        this.min = min;
        this.max = max;
        this.name = name;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        this.min = min;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }


}

ошибка вывода

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javafx.fxml.LoadException: 
file:/home/Projects/2019.08.03_C482/InventorySystem/dist/run1962514670/InventorySystem.jar!/ViewController/MainView.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at c482.C482.start(C482.java:23)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$10(GtkApplication.java:245)
    ... 1 more
Caused by: java.lang.NullPointerException
    at ViewController.MainViewController.initialize(MainViewController.java:142)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 17 more
Exception running application c482.C482
Java Result: 1

1 Ответ

0 голосов
/ 21 октября 2019

Пожалуйста, прочитайте 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);
    }
}

Вот снимок экрана работающего приложения.

inventor.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...