使用SwingNode的JavaFX应用程序在某些计算机上没有正确最大化

时间:2016-04-08 16:28:54

标签: java javafx-8 repaint maximize-window

我有一个稍微复杂的JavaFX GUI,具有以下组件结构(简化),如下所示。您将看到SwingNode用于包含应用程序的主要部分,但我无法告诉您背后的设计原则,因为我没有编写原始代码。

我知道Swing& amp; JavaFX是混合的,但目前还没有时间重新编写UI。该应用程序可在Windows 7/8/10平台上运行,我所看到的如下:

(a)在我测试的三个不同平台上(Windows XP原生,Windows 7 VM,Windows 8 VM,不同大小的显示器),当应用程序的Windows"最大化"单击装饰,应用程序调整大小OK(我的意思是它略微跳跃和延迟,但实际重新绘制以填充屏幕正确完成)。

(b)然而,在另一个平台上,'最大化'导致舞台的整个内容变为白色,并且不会正确重新绘制,直到菜单或其中一个项目被点击为止。有问题的机器是Dell Optiplex 64位Windows 7 Pro SP1,带有1920 x 1080的DVI显示器,源自Intel HD Graphics 4600.ClearType设置为ON,Java版本为1.8.0_73_b02。

关于这个问题还有另外一个问题,但它是在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);
    }

    ....
    ....
}

0 个答案:

没有答案