我最近遇到了一个我无法解释的问题。希望有人知道我能做些什么来解决我的问题。我有一台运行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
答案 0 :(得分:0)
这种情况正在发生,因为移动应用程序的内容在移动到另一台显示器时仍然没有更新,并且仍在尝试从初始监视器获取数据。
试试此链接。它关于在多个监视器上显示JFrame。希望这会有所帮助。
how to display JFrame in full screen display mode at a multi-monitor environment?