Java 在画布中嵌入LWJGL显示,无需装饰
我使用Scala swing来显示需要包含LWJGL显示对象的窗口。我发现的唯一方法是使用中间AWT Canvas实例将显示对象绑定到框架并包装在框架内: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
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)
修复了这个问题。