当前位置: 首页 > 知识库问答 >
问题:

JavaFX和Scene Builder在指定USE_COMPUTED_SIZE的情况下剪辑场景边缘

岳枫
2023-03-14

我正在使用Scene Builder(V11.0.0)为JavaFX(v12)中的场景创建FXML文件,但是,尽管指示所有容器为首选的宽度和高度use_computed_size,但呈现的场景(正如在Scene Builder中看到的,以及作为加载这些FXML文件的JavaFX应用程序运行时看到的那样)在右侧和底部边缘被裁剪,因此节点位被砍掉。

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

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

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

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

这是场景构建器、FXML或JavaFX中已知的bug/限制吗。或者,除了为首选维度选择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>

共有1个答案

宰父志新
2023-03-14

这似乎是JavaFX中的一个bug,特别是datepicker中的bug,因为这个简单的示例可以再现这个问题:

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放在哪个父级似乎并不重要。其他控件也不会出现此问题。

 类似资料:
  • 所以基本上我想做的是改变我的场景的一部分。我想保持一个静态菜单栏在顶部,只改变底部的部分根据哪个菜单按钮正在被点击。这意味着每个“页面”都需要不同的FXML文件和控制器类。 看看可用的JavaFX特性,我认为SubScene可以完成这项工作。但经过进一步的调查,似乎子场景是为3D东西制作的?所以我真的不知道我该做什么。 任何帮助都将不胜感激!

  • 有什么方法可以确定已经附加到场景但设置为不可见的节点的边界(尤其是高度和宽度)吗? 我想仅在其宽度超过100px时才在屏幕上显示标签...但它始终为 0: sysout的结果:(还有n.getWidth()也好不到哪里去) BoundingBox[minX: 0.0, minY: 0.0, minZ: 0.0,宽度: 0.0,高度: 0.0,深度: 0.0, maxX: 0.0, maxY: 0.

  • 我创建了一个游戏,我想给它添加一个开始屏幕,我使用FXML添加了它,还添加了两个按钮(开始和退出)。 按下开始按钮后,我希望游戏加载场景并切换到游戏开始。我对如何做有一个粗略的想法,但我有点挣扎,因为我的SampleController类不知道如何启动游戏等,因为所有代码(以及加载初始开始菜单的代码)都在我的主类中,所以我尝试了这样的事情: 我尝试使用一个函数来切换场景,但它不起作用,也试图使用获

  • 在我的cucumber jvm项目中,我希望在不使用场景大纲的情况下,使用相同的数据集执行场景10次(数据在excel中提供)。 有人能指导我如何做到这一点吗?

  • 我试图将文本字段“Colorbox0”的背景色更改为“Value0”,但它去掉了边框。 以下是我代码的简化版本: 非常感谢您的帮助 谢谢

  • 问题内容: 我有一个使用javafx Scene来渲染某些东西的应用程序,并且我想将该渲染结果放入我在Javafx中创建的某些GUI中。我该怎么做? 基本上,有一些容器可以放入场景,然后将其放入GUI。 抱歉,如果是新手问题,我是JavaFX的新手 问题答案: 该场景只有一个顶级父节点作为根。您可以获取它并放入另一个场景。