1

我有一个稍微复杂的 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);
    }

    ....
    ....
}
4

0 回答 0