0

Scalaのスイングは面白そうに見えますが、どういうわけか不完全であり、古いJavaクラスを使用する必要がある場合もありますが、それらを正しくラップする方法がわかりません。

では、javax.swing.JInternalFrameを正しくラップして、メインフレームのコンポーネントとして使用できるようにするにはどうすればよいですか?

この例をscalaとscalaswingライブラリで動作させようとすると、最終的に内部フレームを取得できましたが、メインフレームはすべての内部フレームを歪め、内部のスペースとまったく同じ幅と高さになるまで伸ばします。 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

問題は、メインフレームのコンテンツ全体として内部フレームを配置できないことです。

したがって、JDesktopPaneをMainFrameのコンテンツとして設定してから、addメソッドを使用して内部フレームをJDesktopPaneに追加する必要があります。

これらの行をメインフレームに追加します

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

メソッドcreateFrameの最後の行を次のように修正します。

desktop.peer.add(newFrame.peer) 

これは醜い解決策です。実行する必要があるのは、JDesktopPaneとJInternalFrameの単純なラッパーを作成することです。

または、InteractiveMesh.orgのより良いソリューションとして、JInternalFrameラッパーを含むImScalaSwingAPIを確認してください。使用する前に、必ずサンプルコードのいくつかを読んでください。

于 2011-10-17T08:33:34.430 に答える