Подтвердить что ты не робот

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

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

the 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>
4b9b3361

Ответ 1

Обновление

Новые функции в версиях 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();
  }
}

Ответ 3

В случае, если вы используете JavaFX GUI Builder "SceneBuilder 2.0" - использовать Tableview свойство ColumnResizePolicy "ограничен-изменения размера" значениер. >