JInternalFrame с scala.swing - PullRequest
       34

JInternalFrame с scala.swing

0 голосов
/ 27 мая 2011

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)
    }
}

Ответы [ 3 ]

6 голосов
/ 27 мая 2011

На спутнике Component определено следующее:

def wrap (c: JComponent): Component 

Итак, вы пишете Component.wrap(new JInternalFrame).

1 голос
/ 17 октября 2011

проблема в том, что вы не можете поместить внутренний фрейм как все содержимое 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Не забудьте прочитать некоторые из их примеров кода, прежде чем использовать его.

1 голос
/ 27 мая 2011

Полагаю, вы делаете это так:

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
...