【问题标题】:JavaFX and Scene Builder clip scene edges despite specifying USE_COMPUTED_SIZE尽管指定了 USE_COMPUTED_SIZE,JavaFX 和 Scene Builder 仍会剪辑场景边缘
【发布时间】:2019-08-19 13:42:21
【问题描述】:

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

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

在场景生成器中查看

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

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

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

如果蓝色边界标记已正确计算以表明需要额外的显示区域宽度和高度,我如何告诉 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>

【问题讨论】:

  • 可能和这个issue有关?如果不是这样,您可以发布您的 FXML 吗?
  • 如果您使用 FXML 文件运行应用程序,您还会遇到同样的问题吗?如果不是,那么问题可能出在 Scene Builder 端。
  • 是的,当应用程序在 Java 中运行并从 Scene Builder 生成的 FXML 文件加载场景时,会看到同样的情况。我怀疑问题可能是场景fx:include其他FXML文件;也许 JavaFX 有一个错误,这意味着当场景包含嵌套的子场景时,它会错误地计算某些边界。我会看看我是否可以在一个简单的 FXML 示例中重现这一点,我可以在这里分享。
  • 好的,@JoséPereda 我发现了一个紧凑的 MVCE,它显示的问题与我在完整应用程序中看到的问题完全相同,因此我更新了我的问题以包含 FXML 和新的屏幕截图。
  • 看起来DatePicker 控件的大小不正确。如果您删除它或设置任何不同于 -1 的宽度,或者添加另一个控件,一切都会正常工作。这对我来说似乎是一个 JavaFX 错误。

标签: java javafx fxml scenebuilder


【解决方案1】:

这似乎是 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 放在哪个父级似乎无关紧要。其他控件也不会出现问题。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2016-08-08
  • 2014-11-02
相关资源
最近更新 更多