带有scala.swing的JInternalFrame

时间:2011-05-27 00:41:34

标签: swing scala wrapper jinternalframe scala-swing

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

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

3 个答案:

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