带scala.swing的JInternalFrame
scala swing看起来很有趣,但不知何故它是不完整的,有时我仍然需要使用旧的java类,但我不知道如何正确包装它们 那么,如何正确包装javax.swing.JInternalFrame,以便将其用作大型机中的组件呢 我试图让示例使用scala和scala swing库,最终我成功地获得了一个内部框架,但我的主机扭曲了所有内部框架并拉伸它们,直到它们的宽度和高度与主机内部的空间完全相同 这是我当前的实现:带scala.swing的JInternalFrame,swing,scala,wrapper,jinternalframe,scala-swing,Swing,Scala,Wrapper,Jinternalframe,Scala Swing,scala swing看起来很有趣,但不知何故它是不完整的,有时我仍然需要使用旧的java类,但我不知道如何正确包装它们 那么,如何正确包装javax.swing.JInternalFrame,以便将其用作大型机中的组件呢 我试图让示例使用scala和scala swing库,最终我成功地获得了一个内部框架,但我的主机扭曲了所有内部框架并拉伸它们,直到它们的宽度和高度与主机内部的空间完全相同 这是我当前的实现: import swing._ import event._ object Inte
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)
}
}
我猜你是这样做的:
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
以下内容在
组件的配套文件中定义:
def wrap (c: JComponent): Component
因此,您需要编写Component.wrap(新的JInternalFrame)
问题是您不能将内部框架作为大型机的全部内容
val desktop = Component.wrap(new javax.swing.JDesktopPane())
contents = desktop
因此,需要将JDesktopPane设置为大型机的内容,然后使用add方法
将内部框架添加到JDesktopPane
在大型机中添加这些行
val desktop = Component.wrap(new javax.swing.JDesktopPane())
contents = desktop
将方法createFrame的最后一行修改为:
desktop.peer.add(newFrame.peer)
这是一个丑陋的解决方案。需要做的是编写一个JDesktopPane和JInternalFrame的简单包装器
或者,最好的解决方案是检查他们的ImScalaSwing API,其中包含JInternalFrame包装器。在使用之前,请务必阅读他们的一些示例代码