JavaFx TableView с нумерацией страниц - PullRequest
1 голос
/ 19 марта 2020

Я сделал F XML в Scenebuilder с Tableview и нумерацией страниц. Но у меня проблемы с настройкой нумерации страниц, особенно PageFactory.

У меня следующий код:

F XML:

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Pagination?>
<?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.text.Font?>

<AnchorPane fx:id="recordsOverview" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="accentor.overview.RecordsOverviewController">
    <children>
      <Pagination fx:id="paginator" onMouseClicked="#pageClicked" prefHeight="20.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="340.0" />
        <HBox alignment="TOP_RIGHT" spacing="20.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="60.0">
            <children>
                <Label prefHeight="25.0" text="Search:" />
                <TextField prefHeight="25.0" prefWidth="137.0" />
                <Label prefHeight="25.0" text="Sort:" />
                <ChoiceBox prefHeight="25.0" prefWidth="100.0" />
                <ChoiceBox prefHeight="25.0" prefWidth="100.0" />
            </children>
            <padding>
                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
            </padding>
        </HBox>
        <Label prefHeight="52.0" text="Records" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0">
            <font>
                <Font size="48.0" />
            </font>
        </Label>
      <TableView fx:id="table" AnchorPane.bottomAnchor="50.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="100.0">
        <columns>
          <TableColumn fx:id="trackid" text="#" />
          <TableColumn fx:id="title" text="Title" />
            <TableColumn fx:id="length" text="Length" />
            <TableColumn fx:id="album" text="Album" />
            <TableColumn fx:id="artists" text="Artist(s)" />
        </columns>
      </TableView>
    </children>
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
</AnchorPane>

Контроллер:

public void fillTable(int page) {
    this.dataModel.setTracksPage(page);
    this.table.setItems(FXCollections.observableArrayList(this.dataModel.getTracks().getData()));
    this.paginator.setCurrentPageIndex(page);
}

@Override
public void showOverview() {
    recordsOverview.setVisible(true);
}

@Override
public void setDataModel(DataModel dataModel) {
    if (this.dataModel == null) {
        this.dataModel = dataModel;
    }
    fillTable(1);
    paginator.setPageCount(this.dataModel.getTracks().getTotalPages());
    this.paginator.setPageFactory((Integer pageIndex) -> {
                fillTable(pageIndex);
                return null; // ???
            }
    );
}

Я просто хочу заполнить таблицу новыми данными, но возвращая ноль, я получаю ошибки. Если я возвращаю что-то еще, например, возвращает новый BorderPane (таблица), он тоже не работает, та же ошибка. Как я могу решить эту проблему?

1 Ответ

3 голосов
/ 19 марта 2020

Ваша фабрика страниц должна вернуть узел, который будет отображаться как «страница». Затем Pagination будет управлять этим узлом и делать его частью графа сцены под ним. То, что вы хотите сделать, это отобразить TableView в нумерации страниц, поэтому вы должны вернуть его с фабрики страниц.

Вы не опубликовали ни одной трассировки стека из ошибок, которые вы упомянули, но я ' Я предполагаю, что происходит то, что когда вы возвращаете таблицу, вы получаете ошибку, потому что TableView уже является частью графа сцены, и узлы не могут существовать в двух разных местах.

Одним из решений является полное исключение таблицы из F XML и просто определение ее в контроллере (установите ее в методе initialize(), а затем верните ссылку на нее из фабрики страниц) ,

Если вы все еще хотите, чтобы он был определен в файле F XML, вы можете определить элементы в F XML, которые не являются частью графа сцены, обернув их в <fx:define> блок .

Итак, ваш F XML будет выглядеть примерно так:

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Pagination?>
<?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.text.Font?>

<AnchorPane fx:id="recordsOverview" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="accentor.overview.RecordsOverviewController">

    <fx:define>
      <TableView fx:id="table" AnchorPane.bottomAnchor="50.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="100.0">
        <columns>
          <TableColumn fx:id="trackid" text="#" />
          <TableColumn fx:id="title" text="Title" />
            <TableColumn fx:id="length" text="Length" />
            <TableColumn fx:id="album" text="Album" />
            <TableColumn fx:id="artists" text="Artist(s)" />
        </columns>
      </TableView>
    </fx:define>

    <children>
      <Pagination fx:id="paginator" onMouseClicked="#pageClicked" prefHeight="20.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="340.0" />
        <HBox alignment="TOP_RIGHT" spacing="20.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0" AnchorPane.topAnchor="60.0">
            <children>
                <Label prefHeight="25.0" text="Search:" />
                <TextField prefHeight="25.0" prefWidth="137.0" />
                <Label prefHeight="25.0" text="Sort:" />
                <ChoiceBox prefHeight="25.0" prefWidth="100.0" />
                <ChoiceBox prefHeight="25.0" prefWidth="100.0" />
            </children>
            <padding>
                <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
            </padding>
        </HBox>
        <Label prefHeight="52.0" text="Records" AnchorPane.leftAnchor="20.0" AnchorPane.rightAnchor="20.0">
            <font>
                <Font size="48.0" />
            </font>
        </Label>

    </children>
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
</AnchorPane>

, а затем вы делаете

this.paginator.setPageFactory((Integer pageIndex) -> {
            fillTable(pageIndex);
            return table; 
        }
);
...