6

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

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

在场景生成器中查看

Scene Builder 中视图的屏幕截图,显示表单设计已在右边缘和下边缘被剪裁,然后是黑色边界,显示内容应该在哪里,然后是蓝色边界标记,显示该边界的范围。

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

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

在 Java 应用程序中呈现的场景的屏幕截图,表单设计在右侧和底部边缘被剪裁,与 Scene Builder 中看到的剪裁程度非常相似。

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

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

这是 Scene Builder、FXML 或 JavaFX 中的已知错误/限制吗?USE_COMPUTED_SIZE或者除了选择首选尺寸之外,我还需要做些什么吗?

为了明确这一点,请参阅下面的示例 FXML,该示例显示了所示问题。

场景.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>

子场景.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>
4

1 回答 1

3

这似乎是 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 中。

于 2019-03-30T05:51:32.987 回答