В scala.swing, как мне удалить компонент из контейнера?

#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 для этого метод удаления.