尽管指定了USE_COMPUTED_SIZE,JavaFX和Scene Builder仍然剪辑场景边缘

时间:2019-03-28 17:18:00

标签: java javafx fxml scenebuilder

我正在使用Scene Builder(v11.0.0)为JavaFX(v12)中的场景创建FXML文件,但是尽管指示所有容器将USE_COMPUTED_SIZE设置为首选的宽度和高度,但是渲染的场景(如图所示)在Scene Builder中以及在作为JavaFX应用程序运行时(加载这些FXML文件)运行时,都会在右边缘和下边缘进行裁剪,以便将节点的一部分切掉。

在Scene Builder中,渲染器似乎必须知道场景不适合允许的边界,因为编辑器显示的蓝色边界标记明显超出了所渲染的矩形。

在Scene Builder中查看

Screenshot of the view in Scene Builder, showing the form design has been clipped at the right and bottom edges, followed by a dark boundary showing where the content ought to be, and then blue boundary markers showing the extent of that boundary.

Scene Builder中的视图显示,底部需要更多空间才能为按钮提供足够的空间(它们的底部边缘和TitledPane的下边缘缺失)。为了适应DatePickerTitledPane的右侧边缘,右侧需要更多空间。蓝色边界标记清楚地显示了实际内容的结束位置,因此尚不清楚为什么计算出的显示区域比该区域短几个像素。

正在运行的Java应用程序视图

Screenshot of the scene rendered within a Java application, the form design clipped at the right and bottom edges, very similar to the degree of clipping seen in Scene Builder.

一旦使用FXML文件填充JavaFX应用程序中的窗口,就会看到相同的结果:该窗口的计算大小是像素数太少,无法正确地适合整个场景。

如果正确计算了蓝色边界标记以显示需要额外的显示区域宽度和高度,那么如何在渲染时告诉FXML要求该额外的空间?

这是Scene Builder,FXML或JavaFX中的已知错误/限制吗?还是除了为首选尺寸选择USE_COMPUTED_SIZE之外,我还需要做更多的事情吗?

为了使这一点明确,请参见下面的示例FXML,其中显示了所说明的问题。

scene.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>

subscene.fxml

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

1 个答案:

答案 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();
    }

}

结果:

image showing improperly sized date picker parent

注意:插入DatePicker的父对象似乎无关紧要,其他控件也不会出现问题。

此问题的解决方法似乎是在调用Window.sizeToScene()之后调用show()。我不明白为什么这会有所作为,但是确实如此。不幸的是,这只会对实际应用程序有所帮​​助,而对于Scene Builder则无济于事。