这是一个非常简单的Scala GUI测试:
import scala.swing._
object FirstSwingApp extends SimpleGUIApplication {
def top = new MainFrame {
contents = new GridPanel(30, 20) {
contents ++= 1 to 600 map (_ => new Label("test"))
}
}
}
每个包含的标签都显示为所需的大小:
现在我想用自定义类型替换Label
:
contents ++= 1 to 600 map (_ => new Foo)
class Foo extends Panel {
override def minimumSize = {
println("minimumSize")
new java.awt.Dimension(32, 32)
}
override def preferredSize = {
println("preferredSize")
new java.awt.Dimension(32, 32)
}
override def maximumSize = {
println("maximumSize")
new java.awt.Dimension(32, 32)
}
}
但结果太小了:
显然,没有调用xxxSize
方法,因为程序不会产生控制台输出。我究竟需要更改什么才能显示每个Foo
的大小为32x32像素?
答案 0 :(得分:4)
这里的问题是scala.swing
只是javax.swing
的包装。在这种情况下,Label
只是一个包含javax.swing.JLabel
的实例。
当组件传递给javax.swing
系统时,只传递组件,而不是包装器。
因此,对包装器重写方法对你没有好处。
但是您可以覆盖实际组件实例上的方法。例如:
import scala.swing._
import javax.swing._
import java.awt.Dimension
import javax.swing.JPanel
object Swg extends SimpleSwingApplication {
class Foo extends Panel {
override lazy val peer: JPanel = new JPanel with SuperMixin {
override def getMinimumSize = new Dimension(32, 32)
override def getPreferredSize = new Dimension(32, 32)
override def getMaximumSize = new Dimension(32, 32)
}
}
def top = new MainFrame {
contents = new GridPanel(30, 20) {
contents ++= List.fill(600)(new Foo)
}
}
}
在我的机器上,它提供640像素宽,约960像素高的帧 - 这可能是你想要的。
答案 1 :(得分:2)
正如Rogach所说,问题是你不要改变底层同伴。另一种可能性如下:
class Foo extends Panel {
preferredSize = new Dimension(32, 32)
}