JavaFX响应式TableView

2022-04-18 00:00:00 java javafx fxml

这张图片非常不言自明。当我调整窗口大小时,TableView不会自动调整大小。在C#中,我过去常常通过使用Anchor/Dock属性来实现这一点。我应该如何在JavaFX中做到这一点?我找不到相关信息,可能是因为Java使用了不同的术语。

able.fxml

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

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<DialogPane prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gui.TableController">
    <header>
        <AnchorPane minHeight="50.0" minWidth="0.0" prefHeight="80.0" prefWidth="400.0">
            <children>
                <HBox alignment="TOP_CENTER" prefHeight="100.0" prefWidth="400.0">
                    <children>
                        <Label fx:id="descriptionLabel" alignment="CENTER" contentDisplay="CENTER" prefWidth="400.0" text="Text:" textAlignment="JUSTIFY">
                            <font>
                                <Font size="22.0" />
                            </font>
                        </Label>
                    </children>
                </HBox>
            </children>
        </AnchorPane>
    </header>
    <content>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="400.0">
            <children>
                <TableView fx:id="tableView" layoutY="-31.0" prefHeight="252.0" prefWidth="400.0">
                    <columns>
                    </columns>
                </TableView>
            </children>
        </AnchorPane>
    </content>
</DialogPane>

TableController.Java

package gui;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.util.Callback;

import java.sql.ResultSet;
import java.sql.SQLException;

public class TableController {

    @FXML
    private Label descriptionLabel;

    @FXML
    private TableView tableView;

    public void setTableResultset(String label, ResultSet resultSet) throws SQLException {
        ObservableList<ObservableList> data = FXCollections.observableArrayList();

        // Columns
        for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
            final int j = i;
            TableColumn col = new TableColumn(resultSet.getMetaData().getColumnName(i + 1));
            col.setCellValueFactory((Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>) param -> {
                return new SimpleStringProperty(param.getValue().get(j).toString());
            });
            tableView.getColumns().add(col);
        }

        // Add records
        while (resultSet.next()) {
            ObservableList<String> row = FXCollections.observableArrayList();
            for (int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
                row.add(resultSet.getString(i));
            }
            data.add(row);
        }
        tableView.setItems(data);

        // Set label text
        descriptionLabel.setText(label);
    }
}


解决方案

您需要设置AnchorPane的上、下、右、左锚:

<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="400.0">
    <children>
        <TableView fx:id="tableView" layoutY="-31.0" prefHeight="252.0" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <columns>
            </columns>
        </TableView>
    </children>
</AnchorPane>

相关文章