有scala.swing.BoxPanel
,但似乎忽略了这一点,因为javax.swing.Box
工厂方法createHorizontalStrut
,createHorizontalGlue
,createVerticalStrut
没有等价物,和createVerticalGlue
。这些方法也会返回java.awt.Component
的实例,因此无法提交给scala.swing.Component.wrap
。
使用scala.swing.BoxPanel
创建间距和粘合是否有任何简单的解决方法?如果没有,是否有任何现有的开源库包含javax.swing.Box
的功能?
答案 0 :(得分:4)
我一直使用以下的胶水和支柱(你可以在REPL中运行它来测试):
import swing._
import Swing._ // object with many handy functions and implicits
val panel = new BoxPanel(Orientation.Vertical) {
contents += new Label("header")
contents += VStrut(10)
contents += new Label("aoeu")
contents += VGlue
contents += new Label("footer")
}
new Frame { contents = panel; visible = true }
还有HGlue和HStrut的方法。
答案 1 :(得分:1)
Swing库中缺少各种功能。
这是我对胶水和支柱的解决方案:
import javax.{swing => jsw}
class HorzPanel extends BoxPanel(Orientation.Horizontal) {
def glue = { peer.add(jsw.Box.createHorizontalGlue); this }
def strut(n: Int) = { peer.add(jsw.Box.createHorizontalStrut(n)); this }
}
object HorzPanel {
def apply(cs: Component*) = new HorzPanel { contents ++= cs }
}
class VertPanel extends BoxPanel(Orientation.Vertical) {
def glue = { peer.add(jsw.Box.createVerticalGlue); this }
def strut(n: Int) = { peer.add(jsw.Box.createVerticalStrut(n)); this }
}
object VertPanel {
def apply(cs: Component*) = new VertPanel { contents ++= cs }
}
当您想添加胶水或支柱时,您只需说明"胶水"或" strut(n)"内联:
new VertPanel {
contents += new Label("Hi")
glue
contents += new Label("there")
}
(假设您正在使用contents +=
方法;它实际上并没有为您添加对象,因此您无法将其与其他项目组合在一起并将其添加为一个集合。)