那么如何正确包装javax.swing.JInternalFrame以便我可以在MainFrame中将它用作Component?
我尝试使用this示例使用scala和scala swing库,我最终设法得到一个内部框架,但我的MainFrame扭曲所有内部框架并拉伸它们直到它们具有完全相同的宽度和高度作为MainFrame内的空间。
这是我目前的实施:
import swing._
import event._
object InternalFrameDemo extends SimpleSwingApplication{
val top = new MainFrame{
title = "InternalFrameDemo"
preferredSize = new Dimension(640,480)
val menuNew = new MenuItem("New"){
mnemonic = Key.N
action = new Action("new"){
def apply(){
createFrame
}
}
}
val menuQuit = new MenuItem("Quit"){
mnemonic = Key.Q
action = new Action("quit"){
def apply(){
quit()
}
}
}
menuBar = new MenuBar{
contents += new Menu("Document"){
mnemonic = Key.D
contents ++= Seq(menuNew,menuQuit)
}
}
def createFrame{
val newFrame = MyInternalFrame()
newFrame.visible = true
contents = newFrame
}
}
}
object MyInternalFrame{
var openFrameCount = 0;
val xOffset, yOffset = 30;
def apply() = {
openFrameCount += 1
val jframe = new javax.swing.JInternalFrame("Document #" + openFrameCount,true,true,true,true)
jframe.setSize(300,300)
jframe.setLocation(xOffset*openFrameCount,yOffset*openFrameCount)
Component.wrap(jframe)
}
}
答案 0 :(得分:6)
以下内容是在Component
:
def wrap (c: JComponent): Component
所以你写Component.wrap(new JInternalFrame)
。
答案 1 :(得分:1)
我猜你是这样做的:
scala> import swing.Component
import swing.Component
scala> import javax.swing.JInternalFrame
import javax.swing.JInternalFrame
scala> class InternalFrame extends Component {
| override lazy val peer = new JInternalFrame
| }
defined class InternalFrame
答案 2 :(得分:1)
问题是你不能把内部框架作为MainFrame的全部内容
因此您需要将JDesktopPane设置为MainFrame的内容,然后使用add方法 将内部框架添加到JDesktopPane
在MainFrame中添加这些行
val desktop = Component.wrap(new javax.swing.JDesktopPane())
contents = desktop
将你的方法createFrame的最后一行修改为:
desktop.peer.add(newFrame.peer)
这是一个丑陋的解决方案。需要做的是编写JDesktopPane和JInternalFrame
的简单包装器或者,InteractiveMesh.org的更好的解决方案,检查他们的ImScalaSwing API,它包含JInternalFrame包装器。在使用它之前,请务必阅读它们的一些示例代码。