2011-05-27 75 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上。在使用它之前,請務必閱讀他們的一些示例代碼。