2012-07-14 14 views
19

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 que no estoy cambiando las propiedades de la tabla de java.columna de la tabla no tomará el tamaño completo de la vista de tabla en javaFX

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

Respuesta

41

actualización

Las nuevas características de los JavaFX 2.2 + comunicados han hecho que esta respuesta obsoleta cuando se aplica con un documento FXML.

Se proporciona una solución basada en FXML que usa nuevas características de FXML para permitir que el tamaño de columna se establezca a través de FXML en: FXML set TableView column resize policy.

<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 la TableView todavía se puede configurar por código como se define en esta respuesta:

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

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

JavaFX proporciona un mecanismo para modify the default column resizing policy. Al establecer la política de cambio de tamaño de la columna en CONSTRAINED_RESIZE_POLICY, la suma de los anchos de cada columna se verá limitada para que cubra el ancho de la tabla, incluso si se cambia el tamaño de la tabla o el tamaño de las columnas. Este es probablemente el comportamiento que deseas.

Si bien puede haber una manera de establecer una RESTRETACIÓN_RESTRATADA en un tableView de FXML, no conozco ninguno (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 en la vista previa de JavaFX 2.2b17).

archivo FXML: Clase

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

Controlador: Clase

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

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

muchas gracias @jewelsea, usted fue el primer y único lugar donde encontré la manera de controlar el redimensionamiento de las columnas. si encuentro una forma de controlar la tabla desde el archivo fxml lo publicaré aquí. – raven

+0

Me parece extraño agregar la configuración de IU en el controlador. Puede hacer lo mismo agregando una etiqueta XML en el archivo .fxml como se muestra en este enlace: http://stackoverflow.com/questions/14095708/fxml-set-tableview-column-resize-policy – gabuzo

+0

Gracias por el enlace gabuzo , Actualicé por respuesta para reflejar la nueva funcionalidad de JavaFX 2.2 que ahora le permite definir la política de cambio de tamaño de columnas de la tabla desde FXML. – jewelsea

2

En caso de usar JavaFX GUI builder "SceneBuilder 2.0" - utilizar TableView propiedad ColumnResizePolicy valor "-cambio de tamaño limitado".

Cuestiones relacionadas