0

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

那么如何正确包装 javax.swing.JInternalFrame 以便可以将其用作 MainFrame 中的组件?

我尝试让这个示例与 scala 和 scala swing 库一起使用,我终于设法获得了一个内部框架,但是我的 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)
    }
}
4

3 回答 3

6

以下是在 的伴侣上定义的Component

def wrap (c: JComponent): Component 

所以你写Component.wrap(new JInternalFrame)

于 2011-05-27T14:43:32.540 回答
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
于 2011-05-27T13:39:11.070 回答
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 包装器。在使用之前一定要阅读他们的一些示例代码。

于 2011-10-17T08:33:34.430 回答