Java 在画布中嵌入LWJGL显示,无需装饰

Java 在画布中嵌入LWJGL显示,无需装饰,java,swing,scala,awt,lwjgl,Java,Swing,Scala,Awt,Lwjgl,我使用Scala swing来显示需要包含LWJGL显示对象的窗口。我发现的唯一方法是使用中间AWT Canvas实例将显示对象绑定到框架并包装在框架内: object Run extends SimpleSwingApplication { System.setProperty("org.lwjgl.opengl.Window.undecorated", "true") val initialWindowSize = new Dimension(256, 240) lazy v

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

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()
  }
}
但是,当窗口初始化并连接显示器时,它显示在画布/框架顶部下方,可能包括标题栏的高度:

如何将显示器附加到具有相同尺寸的画布上?我的印象是窗口尺寸是从父级设置的,尽管我尝试使用相同的值显式地设置DisplayMode。此外,是否可以使用LWJGL显示对象而不将重量级AWT画布对象设置为父对象(但仍在Swing Ui元素中)?

关于轻量级/重量级混合,我建议将画布直接添加到框架的默认内容窗格,这是一个带有
BorderLayout
JPanel
。另外,
pack()
调用会撤消以前的
size\u=

这里没有专家,只是猜测一下:a)您设置了一些关于未装饰窗口的LWJGL属性,但是您的
大型机本身并没有被装饰。b) 您不会替换框架的内容窗格,而是添加到其中。默认情况下,这是一个
JPanel
,带有
BoxLayout
,如果我没记错的话__因此,您将重量级组件添加到轻量级组件中。\uuuu-可能相关:。c) 如果调用
pack()。我还将使框架在最后可见。更正:默认
JPanel
具有
BorderLayout
。不管怎么说,这似乎是解决问题的方法:--也许您看到的偏移量来自非本机菜单栏?谢谢-删除
peer.pack()
并在
大型机中添加
peer.add(canvas,BorderLayout.CENTER)
修复了这个问题。