Изменение содержимого BoxPanel в Swing

#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