我正在处理我正在处理的项目的问题。原始代码太大了,不能在这里发布,但我写了一个有相同问题的简短版本。
基本上,我写了一些聊天框,一个接一个地添加包含对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)