在没有装饰的情况下在画布中嵌入LWJGL显示

时间:2015-10-04 17:53:49

标签: java swing scala awt lwjgl

我使用Scala swing来显示需要包含LWJGL Display对象的窗口。我发现的唯一方法是使用中间AWT Canvas实例将Display对象绑定到Frame并在其中包装:

object Run extends SimpleSwingApplication {

 System.setProperty("org.lwjgl.opengl.Window.undecorated", "true")

  val initialWindowSize = new Dimension(256, 240)

  lazy val top = new MainFrame {
    title = s"Nescala ${nescala.BuildInfo.version}"
    size = initialWindowSize

    visible = true

    peer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
    peer.setFocusable(true)
    peer.setIgnoreRepaint(true)

    peer.add(canvas)

    peer.pack()
  }

  def canvas:Canvas = new Canvas {
    setPreferredSize(initialWindowSize)
    setSize(initialWindowSize)
    setFocusable(true)
    setIgnoreRepaint(true)
    requestFocus()
    setVisible(true)

    override def addNotify() = {
      super.addNotify()
      attachDisplay()
    }

    override def removeNotify() = {
      detachDisplay()
      super.removeNotify()
    }

    def attachDisplay(): Unit = {
      try {
        Display.setParent(this)
        Display.create

      } catch {
        case e:LWJGLException => e.printStackTrace()
      }
    }

    def detachDisplay():Unit = Display.destroy()
  }
}

然而,当窗口初始化并且显示器已连接时,它显示在Canvas / Frame顶部下方,可能包括标题栏的高度: Black bar shows gap between Canvas & LWJGL Display
如何将显示器连接到具有相同尺寸的画布?我的印象是窗口尺寸是从父级设置的,尽管我尝试使用相同的值显式设置DisplayMode。另外,是否可以使用LWJGL Display对象而不将重量级AWT Canvas对象设置为父对象(但仍在Swing Ui元素中)?

1 个答案:

答案 0 :(得分:0)

关于轻量级/重量级混音,我建议将画布直接添加到帧的默认内容窗格中,这是JPanel BorderLayout。此外,pack()调用撤消之前的size_=