使用SwingNodes时JavaFX阶段大小不一致

使用SwingNodes时JavaFX阶段大小不一致,java,swing,javafx,Java,Swing,Javafx,问题:我有一些Swing内容需要使用JavaFX后台显示。Swing内容需要包装在滚动窗格中,以便在调整阶段大小时保持正常的Swing大小 预期行为:首次显示阶段时,需要自动调整其大小以适合Swing内容(即无需滚动查看) 实际行为:阶段部分显示Swing内容(如果阶段在节点填充之前显示)或根本不显示(如果阶段在节点填充之后显示) 如果在添加Swing节点内容之前显示阶段: 如果在添加Swing节点内容后显示阶段,然后调整其大小: 代码:这可能包括一些多余的语句,作为我各种尝试的一部分。

问题:我有一些Swing内容需要使用JavaFX后台显示。Swing内容需要包装在
滚动窗格中
,以便在调整阶段大小时保持正常的Swing大小

预期行为:首次显示阶段时,需要自动调整其大小以适合Swing内容(即无需滚动查看)

实际行为:阶段部分显示Swing内容(如果阶段在节点填充之前显示)或根本不显示(如果阶段在节点填充之后显示)

如果在添加Swing节点内容之前显示阶段:

如果在添加Swing节点内容后显示阶段,然后调整其大小:

代码:这可能包括一些多余的语句,作为我各种尝试的一部分。

有人知道发生了什么以及如何解决这个问题吗?
谢谢

滚动窗格
,加上
SwingNode
,控制起来非常麻烦。这可能就是发生的情况:

  • 滚动窗格
    是根节点,因此
    场景
    需要告诉
    滚动窗格
    它可以给
    滚动窗格
    多少空间
  • 场景
    告诉
    滚动窗格
    它可以使用任意大小的空间(
    场景
    将在初始布局期间尝试调整自身大小)
  • 滚动窗格
    需要告诉其子项进行布局。由于
    滚动窗格
    可以在需要时生成滚动条,因此它将简单地告诉孩子们使用它想要的空间
  • 子对象是
    SwingNode
    ,在布局阶段没有要渲染的内容,它将告诉
    ScrollPane
    ,它需要使用X个空间量,这是某种默认值
  • 滚动窗格将自身大小调整为该大小
  • 滚动窗格
    告诉
    场景
    它需要那么多空间
  • 场景
    舞台
    相应地设置其大小
  • Stage
    可见,所有内容开始呈现
  • SwingNode
    开始渲染Swing组件
  • Swing组件需要更大的空间,并需要来自
    SwingNode
    的请求
  • SwingNode
    滚动窗格
    请求空间
  • ScrollPane
    创建滚动条并继续在小空间中渲染其子项

  • 至于解决办法,我没有找到任何像样的办法。一种方法是在某处设置固定大小(
    滚动窗格
    场景
    旋转节点
    )。另一种方法是将滚动移动到Swing中。

    另一种解决方案是通过getPreferredSize()简单地询问SwingNode其内容应该有多大,然后使用该值设置阶段的大小。我目前正在调查为什么需要fudge变量

    protected static void doSwingNodeTest() {
        final Stage stage = new Stage();
        final SwingNode node = new SwingNode();
        stage.setScene(new Scene(new ScrollPane(node)));
    
        final JPanel j = new JPanel();
        j.setLayout(new BorderLayout());
        j.add(new JLabel("Some text"), BorderLayout.NORTH);
        j.add(new JButton("Some button"), BorderLayout.CENTER);
        j.add(new JButton("East button"), BorderLayout.EAST);
        node.setContent(j);
    
        int fudge = 10;
        stage.setWidth(fudge + node.getContent().getPreferredSize().getWidth());
        stage.setHeight(fudge + node.getContent().getPreferredSize().getHeight());
        stage.show(); 
    
    }
    

    你用的是什么版本的Java?@Adam抱歉,忘了包括这个。在Windows 10I上运行的Java 9最近引发了一些相关问题,不幸的是,当我按原样运行时,这似乎不起作用:在OS X上使用Java 9可以正常工作。您可以尝试添加此VM参数吗-Dprism.allowidpi=错误谢谢你的建议。不幸的是,将滚动移动到Swing中并不能很好地工作,因为Swing世界似乎从未被通知它的视口受到限制,因此需要显示滚动条。。。奇怪的是,我的原始代码在不同的应用程序上下文中工作。。。再加上你对事件的分解,我想知道是否有一个特定的事件序列可以让它工作。我一直在尝试逐步了解这两个版本,但无法很好地追踪其中的差异are@anishthecoder我对Swing不太熟悉,因为近年来我很少接触Swing。如果有某种工具箱或助手可以在呈现Swing组件之前计算它们的大小,那么可以使用它来设置
    SwingNode
    的首选大小。
    protected static void doSwingNodeTest() {
        final Stage stage = new Stage();
        final SwingNode node = new SwingNode();
        stage.setScene(new Scene(new ScrollPane(node)));
    
        final JPanel j = new JPanel();
        j.setLayout(new BorderLayout());
        j.add(new JLabel("Some text"), BorderLayout.NORTH);
        j.add(new JButton("Some button"), BorderLayout.CENTER);
        j.add(new JButton("East button"), BorderLayout.EAST);
        node.setContent(j);
    
        int fudge = 10;
        stage.setWidth(fudge + node.getContent().getPreferredSize().getWidth());
        stage.setHeight(fudge + node.getContent().getPreferredSize().getHeight());
        stage.show(); 
    
    }