带scala.swing的JInternalFrame

带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

scala swing看起来很有趣,但不知何故它是不完整的,有时我仍然需要使用旧的java类,但我不知道如何正确包装它们

那么,如何正确包装javax.swing.JInternalFrame,以便将其用作大型机中的组件呢

我试图让示例使用scala和scala swing库,最终我成功地获得了一个内部框架,但我的主机扭曲了所有内部框架并拉伸它们,直到它们的宽度和高度与主机内部的空间完全相同

这是我当前的实现:

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包装器。在使用之前,请务必阅读他们的一些示例代码