JInternalFrame с scala.swing
Scala Swing выглядит интересно, но почему-то оно неполно, и иногда мне все еще нужно использовать старые классы Java, но я понятия не имею, как мне правильно их обернуть.
Итак, как правильно обернуть javax.swing.JInternalFrame, чтобы я мог использовать его в качестве компонента в моем основном кадре?
Я пытаюсь заставить этот пример работать с scala и библиотекой качания scala, и мне наконец-то удалось получить Внутренний фрейм, но мой 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 ответа
Следующее определено на спутнике Component
:
def wrap (c: JComponent): Component
Так ты пишешь Component.wrap(new JInternalFrame)
,
Я думаю, вы делаете это так:
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
Проблема в том, что вы не можете поместить внутренний фрейм как все содержимое 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. Не забудьте прочитать некоторые из их примеров кода, прежде чем использовать его.