【问题标题】:Undecorated full-screen JFrame showing JPanel doesn't repaint until Alt-tab显示 JPanel 的未修饰全屏 JFrame 直到 Alt-tab 才会重新绘制
【发布时间】:2015-02-26 11:05:48
【问题描述】:

我有一个 JPanel v。下面的函数创建了一个全屏 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 渲染器会使全屏帧变为空白,并且出现白屏。您必须切换选项卡进出,或按开始以绘制面板。我尝试使用以下方法更改 window 的背景:

Container c = window.getContentPane();
c.setBackground(Color.yellow);

这并没有做任何事情,我仍然得到一个白屏。 (虽然我调试的时候可以看到背景属性应用成功了。)

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

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

编辑:不用说,取出 window.add(v) 将使框架渲染得很好,并且改变框架背景等的结果以前不起作用,现在将在框架上可见。

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、自包含、正确示例)。
  • 谢谢,但这是一个庞大的项目。我添加了我认为相关的部分。我等待初步诊断以提供其他位。这不是你应该做的吗?
  • “我已经添加了我认为相关的位” 通过从main(String[) 调用它以在屏幕上显示问题来证明它是相关的。否则我(也许还有其他人)会怀疑您对相关代码已显示的分析。
  • 全屏后,您是否尝试在JPanel 上调用revalidate 和repaint...
  • @AndrewThompson 该项目非常模块化,所有其他位都经过单独测试。此外,它适用于所述的一种特定设置。同样的面板在非屏幕模式下也能正常显示。我对我的分析仍然充满信心,但愿意接受有关我可能在这里遗漏的建议。

标签: java swing jframe jpanel jogl


【解决方案1】:

这是一个已知的problem。 -Dsun.java2d.noddraw=true 解决了它。

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2014-10-02
    • 2014-03-16
    • 1970-01-01
    相关资源
    最近更新 更多