ScrollPane会自动向下滚动,但不会在Scala Swing中向下滚动

时间:2018-03-08 16:13:45

标签: scala swing scroll

我正在处理我正在处理的项目的问题。原始代码太大了,不能在这里发布,但我写了一个有相同问题的简短版本。

基本上,我写了一些聊天框,一个接一个地添加包含对BoxPanel的回复的标签。理想情况下,用户不需要手动滚动,滚动会自动发生并显示聊天的最后回复。

问题在于使用scrollBar.peer.setValue(scrollBar.peer.getMaximum)时, 聊天不会自动向下滚动,即使我在向下滚动之前重新验证()聊天,它也从不显示聊天的最后一行。

这就是代码的样子:

import scala.swing._
import scala.swing.event._

class testUI extends MainFrame {

  title = "testScroll"
  preferredSize = new Dimension(400, 400)
  val chat = new BoxPanel(Orientation.Vertical)
  val inputField = new TextField {
    listenTo(mouse.clicks, this.keys)
    reactions += {
      case KeyPressed(_, Key.Enter, _, _) => if (this.text != "") { printToChat(this.text) }
    }
  }
  val scrollPanel = new ScrollPane(chat)
  var scrollBar = scrollPanel.verticalScrollBar
  val window = new BorderPanel {
    add(inputField, BorderPanel.Position.North)
    add(scrollPanel, BorderPanel.Position.Center)
  }
  contents = window

  def printToChat(s: String) {
    chat.contents += new Label(s) {
      horizontalAlignment = Alignment.Right
      border = Swing.EmptyBorder(20, 20, 0, 0) //(top, left, bottom, right)
    }
    chat.revalidate()
    scrollToBottom()
    inputField.text = ""
  }
  def scrollToBottom() {
    scrollBar.peer.setValue(scrollBar.peer.getMaximum)
  }
}

object testUI {
  def main(args: Array[String]) {
    val ui = new testUI
    ui.visible = true
  }
}

非常感谢您提前:))

编辑:我通过使用Swing.onEDT包装前一行代码来解决我的问题,感谢camickr: Swing.onEDT(scrollBar.peer.setValue(scrollBar.peer.getMaximum)) 而不只是: scrollBar.peer.setValue(scrollBar.peer.getMaximum)

0 个答案:

没有答案