tutorial intellij descargar java user-interface javafx-2 scenebuilder

intellij - javafx scene builder tutorial



La columna de tabla no tomará el tamaño completo de la vista de tabla en javaFX (3)

Actualmente no es posible establecer un CONSTRAINED_RESIZE_POLICY en un tableView desde FXML:

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

Estoy tratando de crear una tabla con dos columnas. Estoy usando el generador de escenas incluido en NetBeans 7.2. en todos los ejemplos que he visto, todo lo que necesita hacer es arrastrar la columna de la tabla a la tabla y tomará el tamaño completo, esto no es cierto en mi caso Este es el archivo fxml generado por el generador de escenas. Para que quede claro, no estoy cambiando las propiedades de la tabla desde Java.

el 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>


En caso de que utilice el constructor de Java GUI "SceneBuilder 2.0" - use la propiedad ColumnResizePolicy "valor de tamaño restringido".


Actualizar

Las nuevas funciones en las versiones de JavaFX 2.2+ han dejado esta respuesta obsoleta cuando se aplica con un documento FXML.

Una solución basada en FXML que utiliza las nuevas funciones de FXML para permitir que el tamaño de la columna se establezca a través de FXML se proporciona en: FXML establece la política de cambio de tamaño de la tabla 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>

Si no está utilizando FXML, la política de cambio de tamaño de TableView aún puede establecerse por código como se define en esta respuesta:

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

En su FXML, ha definido el ancho preferido de la tabla a 837, y el ancho preferido de cada columna a 75. De manera predeterminada, la política de redimensionamiento de columnas de JavaFX mantendrá las columnas en sus anchos preferidos. No conseguirá que las columnas de la tabla ocupen el ancho de toda la tabla a menos que establezca una nueva política de cambio de tamaño de la columna o establezca la suma de los anchos preferidos de todas sus columnas para sumar el ancho de la tabla.

JavaFX proporciona un mecanismo para modificar la política predeterminada de cambio de tamaño de la columna . Al establecer la política de cambio de tamaño de la columna en una CONSTRAINED_RESIZE_POLICY , la suma de los anchos de cada columna se limitará para completar el ancho de la vista de tabla, incluso si se cambia el tamaño de la vista de tabla o se cambia el tamaño de las columnas individuales. Este es probablemente el comportamiento que deseas.

Si bien puede haber una manera de establecer un CONSTRAINED_RESIZE_POLICY en un tableView desde FXML, no conozco uno (aunque mis habilidades en fxml son rudimentarias, por lo que quizás alguien más informado pueda realizar la configuración utilizando fxml puro).

Lo que puede hacer es definir un controlador para su archivo fxml y luego configurar la política de cambio de tamaño en el controlador. El siguiente código muestra un ejemplo completo (escrito contra la vista previa de JavaFX 2.2b17).

Archivo 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>

Clase de controlador

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); } }

Clase de aplicación:

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(); } }