显示JPanel的未修饰的全屏JFrame在Alt-tab之前不会重新绘制

时间:2015-02-26 11:05:48

标签: java swing jframe jpanel jogl

我有一个JPanel v。下面的函数创建了一个名为window的全屏Jframe,它将以这个JPanel为特色。我有:

protected final void fullScreenMulti(final JPanel v)  {
    final JFrame window= new JFrame();
    window.setUndecorated(true);
    window.add(v);
    //window.setVisible(true);
    .
    .
    .
    window.validate();
    window.repaint();
    GraphicsDevice gdev = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
    gdev.setFullScreenWindow(window);

    DisplayMode mode = gdev.getDisplayMode();
    window.setSize(mode.getWidth(), mode.getHeight());
}

这适用于为代码编写的默认渲染。但是,选择使用JOGL的GL渲染器会使全屏帧变为空白,我会看到一个白色屏幕。您必须切换标签,然后按“开始”才能绘制面板。我尝试使用:

更改窗口的背景
Container c = window.getContentPane();
c.setBackground(Color.yellow);

虽然没有做任何事情,但仍然有白屏。 (虽然在我调试时,我可以看到background属性已成功应用。)

同时点击第二个屏幕的空白区域(窗口位于第一个屏幕上),甚至单击“开始”按钮,SOMETIMES会使框架变为黑色,之后我的鼠标适配器无法工作。 (这里究竟会发生什么,我该如何调查?)其他时候,它与Alt-tab具有相同的效果。

在Java中没有做太多Swing的事情而且我有点迷失。看到它似乎在一个渲染器上工作正常而不是另一个渲染器,表明它与GL渲染器有关,但渲染器在我的非全屏模式下渲染JPanel时工作正常;另外我的理解是,渲染器的作用仅仅是缓冲我的JPanel上的视频。(我的意思是渲染器的功能,对吧?)所以可能是某些设置没有在上面指定的情况,但是原始渲染器负责处理它。有什么建议吗?

编辑:不用说,取出window.add(v)将使帧渲染正常,并且更改帧背景等的结果以前不起作用,现在将在帧上可见。

1 个答案:

答案 0 :(得分:0)

这是一个众所周知的problem -Dsun.java2d.noddraw = true 解决了这个问题。