我正在尝试创建一个包含两列的表。 我正在使用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>
答案 0 :(得分:42)
<强>更新强>
JavaFX 2.2+版本中的新功能在应用FXML文档时已经过时了。
基于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,TableView的调整大小策略仍然可以通过此答案中定义的代码进行设置:
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
在FXML中,您已将表的首选宽度定义为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);
}
}
申请类:
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();
}
}
答案 1 :(得分:3)
目前无法在FXML的CONSTRAINED_RESIZE_POLICY
上设置tableView
:
https://forums.oracle.com/forums/thread.jspa?threadID=2337733
答案 2 :(得分:3)
如果您使用JavaFX GUI构建器&#34; Scene Builder 2.0&#34; - 使用TableView属性ColumnResizePolicy&#34;约束调整大小&#34;值。