如何使用contents =添加到Scala面板?

时间:2014-02-14 22:43:35

标签: swing scala

对不起,这一定是一个非常愚蠢的问题..但我到处都看到Scala代码示例 在BoxPanel或某些布局面板上的内容+ =。我想因为它们的内容为mutable.buffer所以你可以添加和删除组件。

但是如何向Scala Panel添加组件?它接受一个seq所以你必须给它一个列表或什么?我知道你可以调用peer.add,但我想知道Scala代码是如何做到的。 :)

例如contents = new Button {}无效。

很抱歉这个简单的问题我对Scala很新。

编辑:

感谢您的回复。我现在的问题虽然变成了..你能不能只扩展一个类?你能为它设置内容吗?或者它永远不会完成,每个人总是只使用与布局管理器关联的面板?

3 个答案:

答案 0 :(得分:4)

Panel class本身是抽象的,这意味着它不能直接实例化,而是作为面板具体实现的“基础”。

它似乎没有一个“通用”方法来添加组件可能是因为每个子类实现了自己的,有时是互不兼容的自定义

正如您可能从上面的示例中看到的那样,很难指定一般“添加”方法在所有这些情况下的含义。

编辑回复:当然可以,没有什么能阻止你自己继承Panel并覆盖contents方法,例如:

val myPanel = new Panel() {
                   private val myContents = (new Content += new Button())
                   override def contents = myContents
              }

您还可以使用Panel作为以一般方式处理面板的方法的类型参数等。只是您不能拥有只是 a {的实例。 {1}},因为同样,类是抽象的,所以你无法实例化它。

请注意,这不是Scala独有的,如果Panel在Java中是抽象的(如JPanel那样),结果将是相同的。

答案 1 :(得分:1)

如果您有按钮:

val button=new Button{
    text="Click me!"
}
or 

val label=new Label{
    text="Look, i'm a label!"
}
or
object myField extends TextField{ columns=2 }

然后你只需使用:

contents=new BoxPanel(Orientation.Vertical){
  contents+=button
  border=Swing.EmptyBorder(10,20,10,20)
}

或以更简单的形式:

 contents=new FlowPanel(){
  contents+=new Label("This is my button:")
  contents+=new Button("Click me!")
  border=Swing.EmptyBorder(10,20,10,20)
}

答案 2 :(得分:1)