Как удалить компонент из контейнера в scala.swing?
В scala.swing я могу добавить компонент в контейнер следующим образом:
new Frame {
contents += label
}
но иногда я хотел бы очистить содержимое контейнера и заменить его новыми компонентами. Исходя из документов, я должен быть в состоянии сделать:
frame.contents.remove(0)
или же
frame.contents.clear
но ни один из них не компилируется ("clear/remove не является членом Seq[scala.swing.Component]").
Как я могу решить это? Кроме того, кажется, что я не могу позвонить frame.contents += blah
после инициализации. Если это так, как мне добавить новый компонент в контейнер?
2 ответа
Если вы говорите о Frame
в частности, вы можете добавить только один элемент, поэтому используйте метод
def contents_= (c: Component) : Unit
и тебе должно быть хорошо. Попробуйте это в REPL (по одной строке за раз, чтобы вы могли видеть, что происходит):
import scala.swing._
val f = new Frame { contents = new Label("Hi") }
f.visible = true
f.contents = new Label("Hey there")
Если вы используете то, что предназначено для нескольких элементов, таких как BoxPanel
, contents
это Buffer
так что вы можете добавить к нему и удалить из него:
val bp = new BoxPanel(Orientation.Vertical)
val (label1,label2) = (new Label("Hi"), new Label("there"))
bp.contents += label1
bp.contents += label2
f.contents = bp // Now you see "Hi" "there" stacked
bp.contents -= label1
f.pack // "Hi" disappears--need pack not repaint to fix layout
bp.contents += label1
f.pack // "Hi" is back, but at the end
Если у вас есть что-то еще, как Component
что вы расширяете, ваша задача переопределить contents
с буфером или есть какой-то другой способ его изменения (или наследовать от SequentialContainer
как сказал J-16).
contents
в Container
был Seq[]
; тебе необходимо SequentialContainer
для этого метода удаления.