Как удалить компонент из контейнера в 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 для этого метода удаления.

Другие вопросы по тегам