对不起,这一定是一个非常愚蠢的问题..但我到处都看到Scala代码示例 在BoxPanel或某些布局面板上的内容+ =。我想因为它们的内容为mutable.buffer所以你可以添加和删除组件。
但是如何向Scala Panel添加组件?它接受一个seq所以你必须给它一个列表或什么?我知道你可以调用peer.add,但我想知道Scala代码是如何做到的。 :)
例如contents = new Button {}无效。
很抱歉这个简单的问题我对Scala很新。
编辑:
感谢您的回复。我现在的问题虽然变成了..你能不能只扩展一个类?你能为它设置内容吗?或者它永远不会完成,每个人总是只使用与布局管理器关联的面板?
答案 0 :(得分:4)
Panel class本身是抽象的,这意味着它不能直接实例化,而是作为面板具体实现的“基础”。
它似乎没有一个“通用”方法来添加组件可能是因为每个子类实现了自己的,有时是互不兼容的自定义:
BoxPanel
,正如您所说,has a settable Buffer
,FlowPanel
似乎要求adding components as constructor arguments,GridBagLayout
和其他一些implement addition via the layout
Map
,正如您可能从上面的示例中看到的那样,很难指定一般“添加”方法在所有这些情况下的含义。
编辑回复:当然可以,没有什么能阻止你自己继承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)
我想看看Scala代码是如何做到的。
https://github.com/scala/scala-swing/blob/v1.0.0-RC2/src/main/scala/scala/swing/Container.scala#L35
当我第一次学习一些Scala时,我也练习了一些Swing代码。这是一个Panel组件,它将自己呈现为一个简单的游戏网格:
https://github.com/som-snytt/House-of-Mirrors-Fork/blob/act/src/main/scala/hom/LightBox.scala#L286
要了解Scala和Swing部分如何组合在一起,请参阅SuperMixin
:
https://github.com/scala/scala-swing/blob/v1.0.0-RC2/src/main/scala/scala/swing/Component.scala#L51
大会:
这是您直接询问的内容: