Проблема привязки TableView prefWidthProperty к его prefWidthProperty родительского контейнера - PullRequest
0 голосов
/ 12 марта 2020

Соответствующий F XML:

<ScrollPane fx:id="scrollpane_var" hbarPolicy="NEVER" prefHeight="200.0" prefWidth="200.0" GridPane.columnSpan="3" GridPane.rowIndex="2" GridPane.rowSpan="5">
         <content>
            <TableView fx:id="tableview_var" prefHeight="169.0" prefWidth="292.0">
              <columns>
                <TableColumn prefWidth="69.0" text="Quantité" />
                <TableColumn prefWidth="161.0" text="Nom" />
                  <TableColumn prefWidth="56.0" text="Prix" />
              </columns>
            </TableView>
         </content>
      </ScrollPane>

Код класса контроллера:

public class Lancer {

    @FXML // fx:id="scrollpane_var
    private ScrollPane scrollpane_var; // Value injected by FXMLLoader

    @FXML // fx:id="tableview_var"
    private TableView<String> tableview_var; // Value injected by FXMLLoaderte void initialize()

    public void initialize() {
    tableview_var.prefWidthProperty().bind(scrollpane_var.prefWidthProperty());
    }

Визуальное представление:

Нажмите, чтобы увидеть скриншот Scenebuilder

, как следует из названия, я пытаюсь привязать ширину TableView к его родительскому контейнеру, и документация немного сбивает с толку, поскольку я очень плохо знаком с GUI Applications.

Эта строка кода - самый длинный, который я получил, и я не знаю, почему он не работает:

 public void initialize() {
        tableview_var.prefWidthProperty().bind(scrollpane_var.prefWidthProperty());
        }

1 Ответ

2 голосов
/ 12 марта 2020

A TableView управляет собственной прокруткой, поэтому вам вообще не следует помещать ее в ScrollPane. Просто пропустите панель прокрутки в макете.

В общем, если вы хотите, чтобы содержимое панели прокрутки соответствовало доступной ширине панели прокрутки, вы должны использовать свойство fitToWidth , вместо того, чтобы пытаться использовать привязку. В общем, привязка ширины префа как это плохая идея; если используемый вами макет или контейнер не обеспечивают нужную вам функциональность, и это почти всегда так, вы должны создать подкласс Pane и переопределить layoutChildren() и другие методы. Здесь TableView уже обеспечивает прокрутку, а в более общих случаях ScrollPane позволяет указать, что содержимое должно соответствовать ширине панели прокрутки.

<ScrollPane ... fitToWidth="true>
    <!-- ... -->
</ScrollPane>

Но опять же, здесь прокрутка панель избыточна.

...