我正在使用Scene Builder(v11.0.0)为JavaFX(v12)中的场景创建FXML文件,但是尽管指示所有容器将USE_COMPUTED_SIZE
设置为首选的宽度和高度,但是渲染的场景(如图所示)在Scene Builder中以及在作为JavaFX应用程序运行时(加载这些FXML文件)运行时,都会在右边缘和下边缘进行裁剪,以便将节点的一部分切掉。
在Scene Builder中,渲染器似乎必须知道场景不适合允许的边界,因为编辑器显示的蓝色边界标记明显超出了所渲染的矩形。
Scene Builder中的视图显示,底部需要更多空间才能为按钮提供足够的空间(它们的底部边缘和TitledPane
的下边缘缺失)。为了适应DatePicker
和TitledPane
的右侧边缘,右侧需要更多空间。蓝色边界标记清楚地显示了实际内容的结束位置,因此尚不清楚为什么计算出的显示区域比该区域短几个像素。
一旦使用FXML文件填充JavaFX应用程序中的窗口,就会看到相同的结果:该窗口的计算大小是像素数太少,无法正确地适合整个场景。
如果正确计算了蓝色边界标记以显示需要额外的显示区域宽度和高度,那么如何在渲染时告诉FXML要求该额外的空间?
这是Scene Builder,FXML或JavaFX中的已知错误/限制吗?还是除了为首选尺寸选择USE_COMPUTED_SIZE
之外,我还需要做更多的事情吗?
为了使这一点明确,请参见下面的示例FXML,其中显示了所说明的问题。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TitledPane animated="false" collapsible="false" text="untitled">
<content>
<HBox>
<children>
<fx:include source="subscene.fxml" />
</children>
</HBox>
</content>
</TitledPane>
<TitledPane animated="false" collapsible="false" text="untitled">
<content>
<HBox>
<children>
<fx:include source="subscene.fxml" />
</children>
</HBox>
</content>
</TitledPane>
<TitledPane animated="false" collapsible="false" text="untitled">
<content>
<HBox alignment="BASELINE_RIGHT">
<children>
<Button mnemonicParsing="false" text="Button" />
<Button mnemonicParsing="false" text="Button" />
</children>
</HBox>
</content>
</TitledPane>
</children>
</VBox>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label text="Label" />
<DatePicker />
</children>
</VBox>
答案 0 :(得分:2)
这似乎是JavaFX中的一个错误,特别是DatePicker
,因为这个简单的示例可以重现该问题:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
VBox root = new VBox(new DatePicker());
// Problem shows up when using USE_COMPUTED_SIZE (the default) as well
root.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
root.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
结果:
注意:插入DatePicker
的父对象似乎无关紧要,其他控件也不会出现问题。
此问题的解决方法似乎是在调用Window.sizeToScene()
之后调用show()
。我不明白为什么这会有所作为,但是确实如此。不幸的是,这只会对实际应用程序有所帮助,而对于Scene Builder则无济于事。