#swing #scala #scala-swing
#swing #scala #scala-swing
Вопрос:
В scala.swing я могу добавить компонент в контейнер следующим образом:
new Frame {
contents = label
}
но иногда я хотел бы очистить содержимое контейнера и заменить их новыми компонентами. Основываясь на документах, я должен быть в состоянии сделать:
frame.contents.remove(0)
или
frame.contents.clear
но ни один из них не компилируется («очистить / удалить не является членом Seq[scala.swing.Компонент]»).
Как я могу это решить? Кроме того, кажется, что я не могу вызвать frame.contents = blah
после инициализации. Если это так, то как мне добавить новый компонент в контейнер?
Ответ №1:
Если вы говорите о 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")
Если вы используете что-то, что предназначено для нескольких элементов, таких как a 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).
Комментарии:
1. Спасибо, это имеет большой смысл.
Ответ №2:
contents
в Container
был Seq[]
; вам нужен SequentialContainer
для этого метод удаления.