2012-07-14 14 views
19

2つの列を持つテーブルを作成しようとしています。 私はnetbeans 7.2に含まれているシーンビルダを使用しています。 私が見たすべての例では、テーブルの列をテーブルにドラッグするだけで十分ですが、これは私の場合は完全ではありません。 これは、シーンビルダによって生成されたfxmlファイルです。 私はテーブルのプロパティをjavaから変更していないことを明確にしています。テーブルの列がjavaFXのテーブルビューのフルサイズを取らない

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> 

答えて

41

更新

FXML文書に適用されたときのJavaFX 2.2以降のリリースでの新機能は廃止され、この答えをレンダリングしています。

新しいFXML機能を使用してFXMLを使用して列サイズを設定できるFXMLベースのソリューションは、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> 

あなたはこの回答で定義されたテーブルビューのサイズ変更ポリシーは、まだコードで設定することができFXMLを使用していない場合:あなたのFXMLで

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

、あなたがの好ましい幅を定義していますテーブルを837に、各カラムの推奨幅を75に設定します。デフォルトでは、JavaFXカラムサイズ変更ポリシーは、カラムを望ましい幅に保ちます。新しい列のサイズ変更ポリシーを設定するか、すべての列の優先幅の合計をテーブルの幅に合わせるまで、テーブル全体の幅を満たすテーブル列を取得することはありません。

JavaFXは、modify the default column resizing policyへのメカニズムを提供しています。列のサイズ変更ポリシーをCONSTRAINED_RESIZE_POLICYに設定すると、tableviewのサイズが変更された場合や列のサイズが変更された場合でも、すべての列の幅の合計がtableviewの幅を満たすように制限されます。これはあなたが望む行動である可能性が高いです。

FXMLからtableViewにCONSTRAINED_RESIZE_POLICYを設定する方法があるかもしれませんが、私は気づいていません(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); 
    } 
} 

Applicationクラス:

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

大変ありがとうございます。@ jewelseaは、私が列のサイズ変更を制御する方法を見つけた最初の唯一の場所でした。私がfxmlからテーブルを制御する方法を見つけたら、ここにそれを掲示します。 – raven

+0

コントローラーにUI設定を追加するのに不思議そうです。 .fxmlファイルにXMLタグを追加することで同じことができます。http://stackoverflow.com/questions/14095708/fxml-set-tableview-column-resize-policy – gabuzo

+0

リンクgabuzoをありがとう、私は新しいJavaFX 2.2の機能を反映するために答えを更新しました.FXMLからテーブルの列サイズ変更ポリシーを定義できるようになりました。 – jewelsea

3

FXMLからtableViewCONSTRAINED_RESIZE_POLICYを設定することはできません:

テーブルビュープロパティを使用 ColumnResizePolicy "制約付きリサイズ" の値を - あなたはJavaFXのGUIビルダー "SceneBuilder 2.0" を使用する場合には

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

+2

としてのJavaFXの2.2リリースでは、FXMLの 'tableView'に' CONSTRAINED_RESIZE_POLICY'を設定することが可能になりました。 – jewelsea

関連する問題