scala.swing Box等价物

时间:2012-08-05 16:29:52

标签: swing scala

scala.swing.BoxPanel,但似乎忽略了这一点,因为javax.swing.Box工厂方法createHorizontalStrutcreateHorizontalGluecreateVerticalStrut没有等价物,和createVerticalGlue。这些方法也会返回java.awt.Component的实例,因此无法提交给scala.swing.Component.wrap

使用scala.swing.BoxPanel创建间距和粘合是否有任何简单的解决方法?如果没有,是否有任何现有的开源库包含javax.swing.Box的功能?

2 个答案:

答案 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 +=方法;它实际上并没有为您添加对象,因此您无法将其与其他项目组合在一起并将其添加为一个集合。)