在 Canvas 内嵌入 LWJGL 显示,无需修饰

Embed LWJGL Display within Canvas without decoration

我正在使用 Scala swing 显示一个 window,它需要包含一个 LWJGL 显示 object。我发现的唯一方法是使用中间 AWT Canvas 实例将 Display object 绑定到并包装在 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()
  }
}

然而,当 window 初始化并连接显示器时,它出现在 Canvas/Frame 顶部下方,可能包括标题栏的高度:
如何将显示器连接到具有相同尺寸的 Canvas?我的印象是 window 尺寸是根据 parent 设置的,尽管我曾尝试使用相同的值显式设置 DisplayMode。此外,是否可以使用 LWJGL Display object 而无需将重量级 AWT Canvas object 设置为 parent(但仍在 Swing Ui 元素中)?

关于lightweight/heavyweight混合,我建议直接将canvas添加到框架的默认内容面板,即JPanelBorderLayout。此外,pack() 调用会撤消之前的 size_=.