无法将数据填充到 javafx 中的 TableView

Can't populate data to TableView in javafx

我是 javafx 的新手,我正在为一个库开发一个小应用程序,它应该在 table 中显示一些数据,但数据无论如何都不会在 table 中显示! , 我已经搜索并完全按照预期的方式制作它,仍然根本没有填充。

注意:DBConnection 是一个连接到数据库的 class,我可以毫无问题地从中读取数据。

主要 class :

package app;

import Connector.DBConnection;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;
import java.sql.Connection;

public class Main extends Application {
    private Connection connection;
    private Parent root;

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.getIcons().add(new Image(String.valueOf(this.getClass().getResource("icon.png"))));
      /*  if(!logIn())
            return;*/
        connection = DBConnection.getActiveConnection();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("main_screen.fxml"));
    //    loader.setLocation(getClass().getResource("main_screen.fxml"));
        Parent root = (VBox) loader.load();


        MainMenuController menuController = loader.getController();

        menuController.setConnection(connection);
        menuController.init();
        menuController.fillTable();

     //   Parent root = FXMLLoader.load(getClass().getResource("main_screen.fxml"));

        primaryStage.setTitle("Hello World");

        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

控制器 class :

package app;


import com.sun.org.omg.CORBA.Initializer;
import javafx.collections.FXCollections;
import javafx.collections.ObservableArray;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import models.Book;
import models.Borrower;
import models.History;

import java.net.URL;
import java.sql.*;
import java.util.ResourceBundle;

public class MainMenuController {
    private Connection connection;
    private final int BOOK_VEIW_COLUMN_COUNT = 9;
    private ObservableList<Book> bookData;

    @FXML
    private TableView<Book> bookView;
    @FXML
    private TableView<History> historyView;
    @FXML
    private TableView<Borrower> borrowerView;
    @FXML
    private TableColumn<Book, Integer> first;
    @FXML
    private TableColumn<Book, String> second;
    @FXML
    private TableColumn<Book, String> third;
    @FXML
    private TableColumn<Book, String> forth;
    @FXML
    private TableColumn<Book, String> fifth;
    @FXML
    private TableColumn<Book, String> sixth;
    @FXML
    private TableColumn<Book, Integer> seventh;
    @FXML
    private TableColumn<Book, Integer> eighth;
    @FXML
    private TableColumn<Book, Integer> ninth;

    public void init(){
        bookData = FXCollections.observableArrayList();
        bookView = new TableView<>();
        first.setCellValueFactory(cellData -> cellData.getValue().numberProperty().asObject());
        second.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
        third.setCellValueFactory(cellData -> cellData.getValue().authorProperty());
        forth.setCellValueFactory(cellData -> cellData.getValue().mainTopicProperty());
        fifth.setCellValueFactory(cellData -> cellData.getValue().secondaryTopicProperty());
        sixth.setCellValueFactory(cellData -> cellData.getValue().divisionProperty());
        seventh.setCellValueFactory(cellData -> cellData.getValue().codeNumberProperty().asObject());
        eighth.setCellValueFactory(cellData -> cellData.getValue().copiesProperty().asObject());
        ninth.setCellValueFactory(cellData -> cellData.getValue().availCopiesProperty().asObject());
    }

    public void setConnection(Connection connection){
        this.connection = connection;
    }

    public void fillTable(){
        try {
            String sql = "select * from books";
            PreparedStatement statement = connection.prepareStatement(sql);
            ResultSet set = statement.executeQuery();
            int currNumber = 1;
            while(set.next()){
                Book book = new Book.BookBuilder()
                        .setAuthor(set.getString("author"))
                        .setAvailCopies(set.getInt("available copies"))
                        .setDivision(set.getString("division"))
                        // .setHistory(set.getString(""))
                        .setSecondaryTopic(set.getString("secondary topic"))
                        .setCopies(set.getInt("copies"))
                        .setID(set.getInt("id"))
                        .setNumber(currNumber++)
                        .setName(set.getString("name"))
                        .setMainTopic(set.getString("main topic"))
                        .setCodeNumber(set.getInt("code number"))
                        .build();
                bookData.add(book);
            }
      //      bookView.getColumns().addAll(first, second, third, forth, fifth, sixth, seventh, eighth, ninth);
            bookView.setItems(bookData);

            //       bookView.getColumns().addAll(first, second, third, forth, fifth, sixth, seventh, eighth, ninth);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

fxml 文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.VBox?>

<?import javafx.scene.control.cell.PropertyValueFactory?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="619.0" prefWidth="1019.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.MainMenuController">
   <children>
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="150.0" prefWidth="600.0">
                       <children>
                          <TableView fx:id="bookView" editable="true" layoutX="200.0" layoutY="-40.0" nodeOrientation="RIGHT_TO_LEFT" prefHeight="302.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                            <columns>
                                <TableColumn fx:id="first" prefWidth="65.0" text="عدد" />
                              <TableColumn fx:id="second" prefWidth="175.0" text="الاسم" />
                              <TableColumn fx:id="third" prefWidth="61.0" text="المؤلف" />
                                <TableColumn fx:id="forth" prefWidth="75.0" text="الموضوع الرئيسى" />
                                <TableColumn fx:id="fifth" prefWidth="75.0" text="الموضوع الفرعى" />
                                <TableColumn fx:id="sixth" prefWidth="75.0" text="رقم التقسيم" />
                                <TableColumn fx:id="seventh" prefWidth="75.0" text="الرقم الكودى" />
                                <TableColumn fx:id="eighth" prefWidth="75.0" text="عدد النسخ" />
                                <TableColumn fx:id="ninth" prefWidth="339.0" text="النسخ المتوفره" />
                            </columns>
                             <columnResizePolicy>
                                <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                             </columnResizePolicy>
                          </TableView>
                       </children>
                    </AnchorPane>
   </children>
</VBox>

图书class:"using builder pattern"

package models;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

/**
 * Created by Andy on 6/21/2016.
 */
public class Book {
    private IntegerProperty number;
    private StringProperty name;
    private StringProperty author;
    private StringProperty mainTopic;
    private StringProperty secondaryTopic;
    private StringProperty division;
    private IntegerProperty codeNumber;
    private IntegerProperty ID;
    private IntegerProperty copies;
    private IntegerProperty availCopies;
    private ObservableList<History> history = FXCollections.observableArrayList();

    public Book(IntegerProperty number, StringProperty name, StringProperty author, StringProperty mainTopic, StringProperty secondaryTopic, StringProperty division, IntegerProperty codeNumber, IntegerProperty ID, IntegerProperty copies, IntegerProperty availCopies, ObservableList<History> history) {
        this.number = number;
        this.name = name;
        this.author = author;
        this.mainTopic = mainTopic;
        this.secondaryTopic = secondaryTopic;
        this.division = division;
        this.codeNumber = codeNumber;
        this.ID = ID;
        this.copies = copies;
        this.availCopies = availCopies;
        this.history = history;
    }

    public int getNumber() {
        return number.get();
    }

    public IntegerProperty numberProperty() {
        return number;
    }

    public void setNumber(int number) {
        this.number.set(number);
    }

    public String getName() {
        return name.get();
    }

    public StringProperty nameProperty() {
        return name;
    }

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

    public String getAuthor() {
        return author.get();
    }

    public StringProperty authorProperty() {
        return author;
    }

    public void setAuthor(String author) {
        this.author.set(author);
    }

    public String getMainTopic() {
        return mainTopic.get();
    }

    public StringProperty mainTopicProperty() {
        return mainTopic;
    }

    public void setMainTopic(String mainTopic) {
        this.mainTopic.set(mainTopic);
    }

    public String getSecondaryTopic() {
        return secondaryTopic.get();
    }

    public StringProperty secondaryTopicProperty() {
        return secondaryTopic;
    }

    public void setSecondaryTopic(String secondaryTopic) {
        this.secondaryTopic.set(secondaryTopic);
    }

    public String getDivision() {
        return division.get();
    }

    public StringProperty divisionProperty() {
        return division;
    }

    public void setDivision(String division) {
        this.division.set(division);
    }

    public int getCodeNumber() {
        return codeNumber.get();
    }

    public IntegerProperty codeNumberProperty() {
        return codeNumber;
    }

    public void setCodeNumber(int codeNumber) {
        this.codeNumber.set(codeNumber);
    }

    public int getID() {
        return ID.get();
    }

    public IntegerProperty IDProperty() {
        return ID;
    }

    public void setID(int ID) {
        this.ID.set(ID);
    }

    public int getCopies() {
        return copies.get();
    }

    public IntegerProperty copiesProperty() {
        return copies;
    }

    public void setCopies(int copies) {
        this.copies.set(copies);
    }

    public int getAvailCopies() {
        return availCopies.get();
    }

    public IntegerProperty availCopiesProperty() {
        return availCopies;
    }

    public void setAvailCopies(int availCopies) {
        this.availCopies.set(availCopies);
    }

    public ObservableList<History> getHistory() {
        return history;
    }

    public void setHistory(ObservableList<History> history) {
        this.history = history;
    }

    public static class BookBuilder{
        private IntegerProperty number;
        private StringProperty name;
        private StringProperty author;
        private StringProperty mainTopic;
        private StringProperty secondaryTopic;
        private StringProperty division;
        private IntegerProperty codeNumber;
        private IntegerProperty ID;
        private IntegerProperty copies;
        private IntegerProperty availCopies;
        private ObservableList<History> history = FXCollections.observableArrayList();
        private final Integer DEFAULT_COPIES_NUMBER = 1;

        public BookBuilder(){
            name = new SimpleStringProperty("");
            author = new SimpleStringProperty("");
            mainTopic = new SimpleStringProperty("");
            secondaryTopic = new SimpleStringProperty("");
            division = new SimpleStringProperty();
            codeNumber = new SimpleIntegerProperty();
            ID = new SimpleIntegerProperty();
            copies = new SimpleIntegerProperty(DEFAULT_COPIES_NUMBER);
            availCopies = new SimpleIntegerProperty(DEFAULT_COPIES_NUMBER);
            number = new SimpleIntegerProperty(DEFAULT_COPIES_NUMBER);
        }


        public BookBuilder setNumber(int number) {
            this.number.set(number);
            return this;
        }

        public BookBuilder setName(String name) {
            this.name.set(name);
            return this;
        }

        public BookBuilder setAuthor(String author) {
            this.author.set(author);
            return this;
        }

        public BookBuilder setMainTopic(String mainTopic) {
            this.mainTopic.set(mainTopic);
            return this;
        }

        public BookBuilder setSecondaryTopic(String secondaryTopic) {
            this.secondaryTopic.set(secondaryTopic);
            return this;
        }

        public BookBuilder setDivision(String division) {
            this.division.set(division);
            return this;
        }

        public BookBuilder setCodeNumber(int codeNumber) {
            this.codeNumber.set(codeNumber);
            return this;
        }

        public BookBuilder setID(int ID) {
            this.ID.set(ID);
            return this;
        }

        public BookBuilder setCopies(int copies) {
            this.copies.set(copies);
            return this;
        }

        public BookBuilder setAvailCopies(int availCopies) {
            this.availCopies.set(availCopies);
            return this;
        }

        public BookBuilder setHistory(ObservableList<History> history) {
            this.history = history;
            return this;
        }

        public Book build(){
            return new Book(number, name, author, mainTopic, secondaryTopic, division, codeNumber, ID, copies, availCopies, history);
        }
    }
}

在你的控制器的 init 方法中你有

bookView = new TableView<>();

但是您已经拥有由 FXML 加载程序创建的 TableView!从现在开始,你对 bookView 所做的所有操作都是在这个新实例上进行的,而不是场景中显示的那个。这意味着您永远不会将项目添加到您看到的 TableView 中,而是添加到另一个从未显示的 table 视图中。

去掉这一行,你的问题应该就解决了。