2011-05-27 72 views
0

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

那么如何正确包装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) 
    } 
} 

回答

6

上的Component同伴被定义如下:

def wrap (c: JComponent): Component 

所以你写Component.wrap(new JInternalFrame)

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 
1

的问题是,你不能把一个内部框架大型机的全部内容

,所以你需要设置的JDesktopPane大型机的内容,然后使用Add方法 内部框架添加到在JDesktopPane的

在你的主机添加这些行

val desktop = Component.wrap(new javax.swing.JDesktopPane()) 
contents = desktop 

修改方法createFrame你的最后一行是:

desktop.peer.add(newFrame.peer) 

这是一个丑陋的解决方案。需要做的事情是编写一个简单的JDesktopPane和JInternalFrame的包装器,并检查它们的ImScalaSwing API(包含JInternalFrame包装器),这是一个更好的解决方案,在InteractiveMesh.org上。在使用它之前,请务必阅读他们的一些示例代码。