我有一个稍微复杂的 JavaFX GUI,其组件结构(简化)如下所示。您将看到 SwingNode 用于包含应用程序的主要部分,但我无法告诉您其背后的设计原则,因为我没有编写原始代码。
我知道在 Swing 和 JavaFX 混合时偶尔会出现奇怪行为的各种警告,但目前没有时间重新编写 UI。该应用程序是为在 Windows 7/8/10 平台上运行而构建的,我看到的内容如下:
(a) 在我测试过的三个不同平台上(Windows XP 原生、Windows 7 VM、Windows 8 VM、不同尺寸的显示器),当单击应用程序的 Windows“最大化”装饰时,应用程序调整大小确定(我的意思是有点跳跃和延迟,但填充屏幕的实际重绘是正确完成的)。
(b) 但是,在另一个平台上,“最大化”会导致舞台的整个内容变白,并且在单击菜单或其项目之一之前不会正确地重新绘制。有问题的机器是戴尔 Optiplex 64 位 Windows 7 Pro SP1,带有来自 Intel HD Graphics 4600 的 1920 x 1080 DVI 显示器。ClearType 设置为 ON,Java 版本为 1.8.0_73_b02。
关于这个问题还有一个关于 SO 的问题,但它是在 2015 年 6 月创建的,从未回答过,所以我不确定该怎么想。
有没有其他人遇到过这个问题和/或觉得能够评论可能导致它的原因?是否有某种“重新验证/重新绘制”代码或 JavaFX 等效代码,这可能值得我尝试作为一种解决方法?
public class Main extends Application
{
private SwingNode mainSwingNode = new SwingNode();
private JPanel mainPanel = new JPanel();
public void start(Stage primaryStage) throws Exception
{
BorderPane parent = new BorderPane(mainSwingNode);
Scene scene = new Scene(parent, 1024, 768);
// Build Swing components
SwingUtilities.invokeLater(() ->
{
createAndShowGUI();
mainSwingNode.setContent(mainPanel);
});
primaryStage.setScene(scene);
primaryStage.show();
}
public void createAndShowGUI()
{
mainPanel.setLayout(new BorderLayout());
// Setup canvas area & canvas rulers
mCanvasTabbedPane.setPreferredSize(new Dimension(800,600));
mainPanel.add(mCanvasTabbedPane, BorderLayout.CENTER);
menubar.initForActionsMap(menuActionsMap);
// Listen for property changes for site to enable/disable menus
ProjSingleton.getInstance().addPropertyChangeListener(menubar);
mainPanel.add(menubar, BorderLayout.NORTH);
// Setup show/hide sidebar button
btnShowSidebar = new JButton(menuActionsMap.get(ShowSidebarAction.class));
menubar.add(Box.createHorizontalGlue());
menubar.add(btnShowSidebar);
btnShowSidebar.setOpaque(false);
btnShowSidebar.setAlignmentX(JComponent.RIGHT_ALIGNMENT);
btnShowSidebar.setBorder(new EmptyBorder(new Insets(2,2,2,2)));
// Add site manager toolbar
sidebar.setLayout(new GridLayout(2, 0));
sidebar.setAlignmentX(JComponent.RIGHT_ALIGNMENT);
sidebar.add(siteManagementPanel);
sidebar.add(new JScrollPane(layerManagerView));
mainPanel.add(sidebar, BorderLayout.EAST);
Main.statusBar = new StatusBar();
Main.statusBar.setCanvasTabbedPane(mCanvasTabbedPane);
mainPanel.add(Main.statusBar, BorderLayout.SOUTH);
mainPanel.setVisible(true);
}
....
....
}