#swing #scala
#swing #scala
Вопрос:
Я пытаюсь удалить a label
из contents
a BoxPanel
в Scala-Swing, но я получаю следующую ошибку.
value contents is not a member of Seq[scala.swing.Component]
contents.contents -= label //Problem here
^
Я проверил и обнаружил, что он является членом scala.Seq
. Теперь я не уверен, что здесь происходит не так.
def contents : scala.Seq[scala.swing.Component] = { /* compiled code */ }
Мой код приведен ниже.
import scala.swing._
import scala.swing.event._
object Starter extends SimpleSwingApplication {
def top = new MainFrame {
title = "Swing Test APp"
val button = new Button {
text = "Click if you can"
}
val label = new Label {
text = ") Clicks"
}
contents = new BoxPanel(Orientation.Vertical) {
contents = button
contents = label
border = Swing.EmptyBorder(30, 30, 10, 30)
}
listenTo(button)
var numClicks = 0
reactions = {
case ButtonClicked(b) =>
numClicks = 1
contents.contents -= label //Problem here
label.text = numClicks.toString()
}
}
}
Ответ №1:
Проблема в том, что вы пытаетесь получить доступ BoxPanel
через общий contents
метод вашего фрейма, тип которого просто Seq[Component]
, тогда как панель box фактически реализует SequentialContainer
интерфейс, который позволяет изменять его содержимое.
Просто сохраните дескриптор вашей панели box напрямую:
def top: Frame = new Frame {
title = "Swing Test App"
val button = new Button("Click if you can")
val label = new Label("0 Clicks")
val box = new BoxPanel(Orientation.Vertical) {
contents = button
contents = label
border = Swing.EmptyBorder(30, 30, 10, 30)
}
contents = box
listenTo(button)
var numClicks = 0
reactions = {
case ButtonClicked(b) =>
numClicks = 1
if (numClicks < 3) {
label.text = s"$numClicks Clicks"
} else {
box.contents -= label
box.revalidate() // refresh layout
box.repaint()
}
}
pack()
open()
}
top