JavaFX:GridPane 计算不正确的列宽
JavaFX: GridPane calculating incorrect column width
我原以为 GridPane 会根据该列中所有元素的最大首选宽度来计算每列的默认宽度。但是,在我的代码中,它似乎计算出的宽度太小,导致列中的一个标签被截断。
这是我的 "cashflowform.fxml":
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.Box?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="finfx.ui.CashFlowForm"
style="-fx-padding:25;"
vgap="5" hgap="5">
<Label text="Datum"
GridPane.columnIndex="0" GridPane.rowIndex="0">
</Label>
<DatePicker fx:id="datePicker" GridPane.columnIndex="1" GridPane.rowIndex="0"/>
<Label text="Betrag"
GridPane.columnIndex="0" GridPane.rowIndex="1">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label text="Kategorie"
GridPane.columnIndex="0" GridPane.rowIndex="2">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label text="Anmerkung"
GridPane.columnIndex="0" GridPane.rowIndex="3">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="3"/>
<Box GridPane.columnIndex="0" GridPane.rowIndex="4"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS"
height="20">
</Box>
<Button text="Speichern"
GridPane.columnIndex="0" GridPane.rowIndex="5"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
<Button text="Speichern & Weitere Position..."
GridPane.columnIndex="0" GridPane.rowIndex="6"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
<Button text="Abbrechen"
GridPane.columnIndex="0" GridPane.rowIndex="7"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
</GridPane>
这就是我设置舞台的方式(注意我没有设置任何尺寸,所以我让它自己计算尺寸):
primaryStage.setScene(new Scene(FXMLLoader.loadFxmlRoot("cashflowform")));
primaryStage.show();
结果:
如您所见,第一列太小,无法完全显示我的 "Anmerkung" 标签。为什么会这样,解决这个问题的最佳方法是什么?
PS:作为附带问题,如果有人关心,我还注意到我添加的 "Box" 作为 space 填充符添加到 labels/fields 和当您仔细观察时,按钮实际上显示为一条白色垂直线。似乎 Box 不适合用于此目的。我刚开始使用 JavaFX,什么是 Swing 的 "Box.createVerticalGlue()" 的合适对应物?
PPS:在有人问之前:在我的代码中看到的 "FXMLLoader" 不是 javafx.fxml.FXMLLoader,而是自定义实用程序 class
谢谢!
我发现了。设置
minWidth="-Infinity"
因为标签修复了它,因为 -Infinity 实际上解析为 Region/Control.USE_PREF_SIZE.
我不知道为什么必须这样做,因为根据 GridPane 的文档,使用首选大小应该是列大小调整的默认行为。对我来说,必须这样做似乎是一种黑客行为。但无论如何,这解决了问题。
我原以为 GridPane 会根据该列中所有元素的最大首选宽度来计算每列的默认宽度。但是,在我的代码中,它似乎计算出的宽度太小,导致列中的一个标签被截断。
这是我的 "cashflowform.fxml":
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.shape.Box?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="finfx.ui.CashFlowForm"
style="-fx-padding:25;"
vgap="5" hgap="5">
<Label text="Datum"
GridPane.columnIndex="0" GridPane.rowIndex="0">
</Label>
<DatePicker fx:id="datePicker" GridPane.columnIndex="1" GridPane.rowIndex="0"/>
<Label text="Betrag"
GridPane.columnIndex="0" GridPane.rowIndex="1">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<Label text="Kategorie"
GridPane.columnIndex="0" GridPane.rowIndex="2">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<Label text="Anmerkung"
GridPane.columnIndex="0" GridPane.rowIndex="3">
</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="3"/>
<Box GridPane.columnIndex="0" GridPane.rowIndex="4"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS"
height="20">
</Box>
<Button text="Speichern"
GridPane.columnIndex="0" GridPane.rowIndex="5"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
<Button text="Speichern & Weitere Position..."
GridPane.columnIndex="0" GridPane.rowIndex="6"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
<Button text="Abbrechen"
GridPane.columnIndex="0" GridPane.rowIndex="7"
GridPane.columnSpan="2"
GridPane.hgrow="ALWAYS" maxWidth="Infinity">
</Button>
</GridPane>
这就是我设置舞台的方式(注意我没有设置任何尺寸,所以我让它自己计算尺寸):
primaryStage.setScene(new Scene(FXMLLoader.loadFxmlRoot("cashflowform")));
primaryStage.show();
结果:
如您所见,第一列太小,无法完全显示我的 "Anmerkung" 标签。为什么会这样,解决这个问题的最佳方法是什么?
PS:作为附带问题,如果有人关心,我还注意到我添加的 "Box" 作为 space 填充符添加到 labels/fields 和当您仔细观察时,按钮实际上显示为一条白色垂直线。似乎 Box 不适合用于此目的。我刚开始使用 JavaFX,什么是 Swing 的 "Box.createVerticalGlue()" 的合适对应物?
PPS:在有人问之前:在我的代码中看到的 "FXMLLoader" 不是 javafx.fxml.FXMLLoader,而是自定义实用程序 class
谢谢!
我发现了。设置
minWidth="-Infinity"
因为标签修复了它,因为 -Infinity 实际上解析为 Region/Control.USE_PREF_SIZE.
我不知道为什么必须这样做,因为根据 GridPane 的文档,使用首选大小应该是列大小调整的默认行为。对我来说,必须这样做似乎是一种黑客行为。但无论如何,这解决了问题。