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