辅助监视器上的Swing Paint问题?

时间:2017-08-23 11:23:47

标签: java swing

我最近遇到了一个我无法解释的问题。希望有人知道我能做些什么来解决我的问题。我有一台运行Windows 7 64位的双监视器。两个显示器都是相同的型号和设置。主监视器位于右侧。我正在使用JRE 1.8.0_131

我看到的问题是,最近我发现我无法再在第二台显示器上运行Java Swing应用程序了。这之前工作得很好,因为我可以在两台显示器之间移动我的应用程序,调整大小和切换到最大化而没有问题。现在每当我的应用程序在我的第二台显示器上时,我看到的只是一个框架,显示我框架背后的部分框架

下面是一个小示例程序,它为每个监视器创建一个框架。我的主显示器上的框架看起来很好。我的辅助监视器上的那个像我提到的那样搞砸了。简单地将坏帧移动到我的主监视器没有什么可以解决它,但如果我最小化然后恢复它看起来很好(即如果我强制框架在主监视器上重绘它看起来很好)。同样,将好帧移动到辅助监视器并强制重绘会导致坏帧

我的JRE几个月没有更新,所以这似乎不是问题。作为一个实验,我尝试使用JDK 1.7.0_17,但它有相同的结果。我的机器昨天获得了Windows更新,这可能恰巧是我注意到这个问题。我并不是说这是问题,只是注意到我的信息

无论如何,任何想法或建议都将不胜感激。这个问题很烦人,因为双监视器支持有助于我的应用程序和Eclipse同时可见,以及我的应用程序有多个帧,我每个监视器放置一个

SwingUtilities.invokeLater(new Runnable()
{
    @Override
    public void run()
    {
        for (final GraphicsDevice device : GraphicsEnvironment
            .getLocalGraphicsEnvironment().getScreenDevices())
        {
            final DisplayMode displayMode = device.getDisplayMode();

            LOGGER.debug(
                "testSwing: device: {}, ID string: {}, isFullScreenSupported: {}, "
                    + "displayModeWidth: {}, displayModeHeight: {}, "
                    + "displayModeBitDepth: {}, displayModeRefreshRate: {}", device,
                device.getIDstring(), device.isFullScreenSupported(),
                displayMode.getWidth(), displayMode.getHeight(), displayMode.getBitDepth(),
                displayMode.getRefreshRate());

            if (GraphicsDevice.TYPE_RASTER_SCREEN == device.getType())
            {
                final GraphicsConfiguration configuration =
                    device.getDefaultConfiguration();

                final JFrame frame = new JFrame("Test Frame", configuration);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(
                    new JLabel(device.getIDstring(), SwingConstants.CENTER));

                final Rectangle screenBounds = configuration.getBounds();

                frame.setBounds((screenBounds.x + (screenBounds.width / 2)) - 100,
                    (screenBounds.y + (screenBounds.height / 2)) - 100, 200, 200);

                frame.setVisible(true);
            }
        }
    }
});

注意:LOGGER只是一个SLF4J记录器,我只是为了查看是否有任何有用的信息我可以收集。这可以在运行时删除,因为它对上述问题没有影响

在我的机器上运行此输出:

  

testSwing:device:Win32GraphicsDevice [screen = 0],ID string:\ Display0,isFullScreenSupported:true,displayModeWidth:1920,displayModeHeight:1200,displayModeBitDepth:32,displayModeRefreshRate:59

     

testSwing:device:Win32GraphicsDevice [screen = 1],ID string:\ Display1,isFullScreenSupported:true,displayModeWidth:1920,displayModeHeight:1200,displayModeBitDepth:32,displayModeRefreshRate:59

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为移动应用程序的内容在移动到另一台显示器时仍然没有更新,并且仍在尝试从初始监视器获取数据。

试试此链接。它关于在多个监视器上显示JFrame。希望这会有所帮助。

how to display JFrame in full screen display mode at a multi-monitor environment?