Столбец таблицы не будет занимать полный размер представления таблицы в javaFX

я пытаюсь создать таблицу с двумя столбцами. Я использую конструктор сцен, включенный в netbeans 7.2. во всех примерах, которые я видел, все, что вам нужно сделать, это перетащить столбец таблицы в таблицу, и он займет полный размер, в моем случае это не так. это файл fxml, сгенерированный конструктором сцен. просто чтобы было ясно, я не меняю свойства таблицы из java.

FXML:

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

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" prefHeight="758.0" prefWidth="956.0" styleClass="screen" xmlns:fx="http://javafx.com/fxml" fx:controller="bgu.dcr.az.cpu.ui.expb.ExperimentBuilderScreen">
  <children>
    <GridPane id="gridPane1" prefHeight="517.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
      <children>
        <Label id="label1" alignment="CENTER" contentDisplay="CENTER" prefHeight="38.0" prefWidth="9999.0" styleClass="caption" text="Create New Experiment" textFill="#990000" GridPane.columnIndex="0" GridPane.rowIndex="0">
          <font>
            <Font name="Consolas Bold" size="20.0" />
          </font>
        </Label>
        <HBox id="hBox1" alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="5.0" GridPane.columnIndex="0" GridPane.rowIndex="1">
          <children>
            <Label id="label2" graphicTextGap="0.0" styleClass="field-label" text="Experiment Name">
              <font>
                <Font name="Consolas" size="15.0" />
              </font>
              <HBox.margin>
                <Insets top="3.0" />
              </HBox.margin>
            </Label>
            <TextField id="textField1" prefWidth="200.0" HBox.hgrow="ALWAYS" />
            <Button id="button2" fx:id="saveButton" styleClass="dialog-button" text="Save" />
            <Button id="button3" styleClass="dialog-button" text="Dismiss" />
          </children>
          <padding>
            <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" />
          </padding>
        </HBox>
        <VBox id="VBox" alignment="CENTER" spacing="5.0" GridPane.columnIndex="0" GridPane.rowIndex="2">
          <children>
            <Label id="label3" prefWidth="9999.0" styleClass="field-label" text="Experiment Tests">
              <VBox.margin>
                <Insets left="5.0" top="5.0" />
              </VBox.margin>
            </Label>
            <HBox id="HBox" alignment="CENTER" spacing="5.0">
              <children>
                <Button id="button1" prefHeight="999.0" styleClass="add-button" text="New">
                  <HBox.margin>
                    <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" />
                  </HBox.margin>
                </Button>
                <ListView id="listView1" fx:id="tests" orientation="HORIZONTAL" prefHeight="999.0" prefWidth="200.0" HBox.hgrow="ALWAYS">
                  <HBox.margin>
                    <Insets bottom="4.0" right="5.0" top="4.0" />
                  </HBox.margin>
                </ListView>
              </children>
            </HBox>
          </children>
        </VBox>
        <VBox id="vBox1" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="0" GridPane.rowIndex="3">
          <children>
            <GridPane id="gridPane2" VBox.vgrow="ALWAYS">
              <children>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.rowSpan="4">
                  <children>
                    <Label id="label4" text="Algorithms">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_algo.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" fx:id="newAlgorithmButton" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" />
                  </children>
                  <GridPane.margin>
                    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" fx:id="x2" />
                  </GridPane.margin>
                </VBox>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="1" GridPane.margin="$x2" GridPane.rowIndex="1">
                  <children>
                    <Label id="label4" text="Problem Generator">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_pgen.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" maxHeight="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" />
                  </children>
                </VBox>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="2" GridPane.margin="$x2" GridPane.rowIndex="1">
                  <children>
                    <Label id="label4" prefWidth="9999.0" text="Correctness tester">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_ctest.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" />
                  </children>
                </VBox>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="1" GridPane.margin="$x2" GridPane.rowIndex="2">
                  <children>
                    <Label id="label4" prefWidth="130.0" text="Message delayer">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_mdel.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" />
                  </children>
                </VBox>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="2" GridPane.margin="$x2" GridPane.rowIndex="2">
                  <children>
                    <Label id="label4" prefWidth="130.0" text="Limiter">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_limiter.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" />
                  </children>
                </VBox>
                <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="3" GridPane.margin="$x2" GridPane.rowIndex="0" GridPane.rowSpan="4">
                  <children>
                    <Label id="label4" prefWidth="9999.0" text="Statistic collectors">
                      <graphic>
                        <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true">
                          <image>
                            <Image url="@_scol.png" preserveRatio="false" smooth="false" />
                          </image>
                        </ImageView>
                      </graphic>
                    </Label>
                    <Button id="button1" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" />
                  </children>
                </VBox>
                <HBox id="hBox1" alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="5.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="0">
                  <children>
                    <Label id="label2" graphicTextGap="0.0" styleClass="field-label" text="Name">
                      <HBox.margin>
                        <Insets top="7.0" />
                      </HBox.margin>
                    </Label>
                    <TextField id="textField1" maxHeight="28.0" minHeight="28.0" prefHeight="28.0" prefWidth="200.0" text="Empty Test" HBox.hgrow="ALWAYS" />
                  </children>
                  <padding>
                    <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" />
                  </padding>
                </HBox>
                <VBox id="vBox3" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
              </children>
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
              </columnConstraints>
              <rowConstraints>
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
            </GridPane>
          </children>
        </VBox>
        <VBox id="vBox4" alignment="CENTER" styleClass="with-dashed-border" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS">
          <children>
            <TableView id="tableView1" prefHeight="54.0" prefWidth="837.0" VBox.vgrow="ALWAYS">
              <columns>
                <TableColumn prefWidth="75.0" text="Column X" />
                <TableColumn prefWidth="75.0" text="Column X" />
              </columns>
            </TableView>
          </children>
          <GridPane.margin>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" fx:id="x2" />
          </GridPane.margin>
        </VBox>
      </children>
      <columnConstraints>
        <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
      </columnConstraints>
      <rowConstraints>
        <RowConstraints maxHeight="38.0" minHeight="38.0" prefHeight="38.0" vgrow="NEVER" />
        <RowConstraints maxHeight="32.0" minHeight="32.0" prefHeight="32.0" vgrow="NEVER" />
        <RowConstraints maxHeight="100.0" minHeight="100.0" prefHeight="100.0" vgrow="SOMETIMES" />
        <RowConstraints vgrow="SOMETIMES" />
        <RowConstraints maxHeight="100.0" prefHeight="100.0" valignment="CENTER" vgrow="ALWAYS" />
      </rowConstraints>
    </GridPane>
  </children>
  <stylesheets>
    <URL value="@_style.css" />
    <URL value="@../_style.css" />
  </stylesheets>
</AnchorPane>

person Raven    schedule 14.07.2012    source источник


Ответы (3)


Обновить

Новые функции в выпусках JavaFX 2.2+ сделали этот ответ устаревшим при применении к документу FXML.

Решение на основе FXML, в котором используются новые функции FXML, позволяющие устанавливать размер столбца с помощью FXML, представлено в: FXML устанавливает политику изменения размера столбца TableView.

<TableView fx:id="tableView" layoutX="110.0" layoutY="78.0" prefHeight="200.0" prefWidth="396.0">
    <columnResizePolicy><TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/></columnResizePolicy>
    <columns>
        <TableColumn prefWidth="75.0" text="Column X" />
        <TableColumn prefWidth="75.0" text="Column X" />
    </columns>
</TableView>

Если вы не используете FXML, политику изменения размера TableView все равно можно установить с помощью кода, как определено в этом ответе:

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

В вашем FXML вы определили предпочтительную ширину таблицы до 837 и предпочтительную ширину каждого столбца до 75. По умолчанию политика изменения размера столбца JavaFX будет поддерживать столбцы с их предпочтительной шириной. Вы не получите столбцы таблицы, заполняющие ширину всей таблицы, если вы либо не установите новую политику изменения размера столбца, либо не установите сумму предпочтительных ширин всех ваших столбцов, чтобы добавить к ширине вашей таблицы.

JavaFX предоставляет механизм изменить политику изменения размера столбца по умолчанию. Установив для политики изменения размера столбца значение CONSTRAINED_RESIZE_POLICY, сумма ширин каждого столбца будет ограничена для заполнения ширины табличного представления, даже если изменяется размер табличного представления или изменяются размеры отдельных столбцов. Это, вероятно, поведение, которое вы хотите.

Хотя может быть способ установить CONSTRAINED_RESIZE_POLICY в tableView из FXML, я не знаю об этом (хотя мои навыки в fxml находятся в зачаточном состоянии, поэтому, возможно, кто-то более информированный может выполнить настройку, используя чистый fxml).

Что вы можете сделать, так это определить контроллер для вашего файла fxml, а затем настроить политику изменения размера в контроллере. Следующий код демонстрирует полный пример (написанный для предварительного просмотра JavaFX 2.2b17).

FXML-файл:

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

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="tableview.TableViewController">
  <children>
    <TableView fx:id="tableView" layoutX="110.0" layoutY="78.0" prefHeight="200.0" prefWidth="396.0">
      <columns>
        <TableColumn prefWidth="75.0" text="Column X" />
        <TableColumn prefWidth="75.0" text="Column X" />
      </columns>
    </TableView>
  </children>
</AnchorPane>

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

package tableview;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;

/* controller class for the tableview fxml definition */
public class TableViewController implements Initializable {
  @FXML //  fx:id="tableView"
  private TableView<?> tableView; // Value injected by FXMLLoader

  @Override // This method is called by the FXMLLoader when initialization is complete
  public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
    assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file 'tableview.fxml'.";

    // initialize your logic here: all @FXML variables will have been injected
    tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
  }
}

Класс приложения:

package tableview;

import java.io.IOException;
import java.net.URL;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

/** Main application class for tableview fxml demo application */
public class TableViewApplication extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage stage) throws IOException {
    AnchorPane layout = FXMLLoader.load(
      new URL(TableViewApplication.class.getResource("tableview.fxml").toExternalForm())
    );
    stage.setScene(new Scene(layout));
    stage.show();
  }
}
person jewelsea    schedule 14.07.2012
comment
Большое спасибо @jewelsea, вы были первым и единственным местом, где я нашел способ контролировать изменение размера столбцов. если я найду способ управлять таблицей из fxml, я опубликую его здесь. - person Raven; 23.07.2012
comment
Мне кажется странным добавлять конфигурацию пользовательского интерфейса в контроллер. Вы можете сделать то же самое, добавив тег XML в файл .fxml, как показано в этой ссылке: stackoverflow.com/questions/14095708/ - person gabuzo; 06.01.2013
comment
Спасибо за ссылку, gabuzo, я обновил ответ, чтобы отразить новую функциональность JavaFX 2.2, которая теперь позволяет вам определять политику изменения размера столбца таблицы из FXML. - person jewelsea; 07.01.2013
comment
Хорошо, также работайте для TreeTableView:: <TreeTableView fx:id="eltTree" > <columnResizePolicy><TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY"/></columnResizePolicy> - person pdem; 03.05.2016

В настоящее время невозможно установить CONSTRAINED_RESIZE_POLICY на tableView из FXML:

https://forums.oracle.com/forums/thread.jspa?threadID=2337733

person Edu Castrillon    schedule 21.08.2012
comment
Начиная с выпуска JavaFX 2.2, теперь можно установить CONSTRAINED_RESIZE_POLICY на tableView из FXML (см. мой обновленный ответ для синтаксиса). - person jewelsea; 07.01.2013

Если вы используете построитель графического интерфейса JavaFX "SceneBuilder 2.0" - используйте свойство TableView ColumnResizePolicy значение "constrained-resize".

person Zon    schedule 01.02.2015