使用SwingNodes时JavaFX阶段大小不一致
问题:我有一些Swing内容需要使用JavaFX后台显示。Swing内容需要包装在使用SwingNodes时JavaFX阶段大小不一致,java,swing,javafx,Java,Swing,Javafx,问题:我有一些Swing内容需要使用JavaFX后台显示。Swing内容需要包装在滚动窗格中,以便在调整阶段大小时保持正常的Swing大小 预期行为:首次显示阶段时,需要自动调整其大小以适合Swing内容(即无需滚动查看) 实际行为:阶段部分显示Swing内容(如果阶段在节点填充之前显示)或根本不显示(如果阶段在节点填充之后显示) 如果在添加Swing节点内容之前显示阶段: 如果在添加Swing节点内容后显示阶段,然后调整其大小: 代码:这可能包括一些多余的语句,作为我各种尝试的一部分。
滚动窗格中
,以便在调整阶段大小时保持正常的Swing大小
预期行为:首次显示阶段时,需要自动调整其大小以适合Swing内容(即无需滚动查看)
实际行为:阶段部分显示Swing内容(如果阶段在节点填充之前显示)或根本不显示(如果阶段在节点填充之后显示)
如果在添加Swing节点内容之前显示阶段:
如果在添加Swing节点内容后显示阶段,然后调整其大小:
代码:这可能包括一些多余的语句,作为我各种尝试的一部分。
有人知道发生了什么以及如何解决这个问题吗?
谢谢
滚动窗格
,加上SwingNode
,控制起来非常麻烦。这可能就是发生的情况:
滚动窗格
是根节点,因此场景
需要告诉滚动窗格
它可以给滚动窗格
多少空间场景
告诉滚动窗格
它可以使用任意大小的空间(场景
将在初始布局期间尝试调整自身大小)滚动窗格
需要告诉其子项进行布局。由于滚动窗格
可以在需要时生成滚动条,因此它将简单地告诉孩子们使用它想要的空间SwingNode
,在布局阶段没有要渲染的内容,它将告诉ScrollPane
,它需要使用X个空间量,这是某种默认值滚动窗格将自身大小调整为该大小
滚动窗格
告诉场景
它需要那么多空间场景
和舞台
相应地设置其大小Stage
可见,所有内容开始呈现SwingNode
开始渲染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();
}