下面是一个非常简单的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像素的大小显示,我到底需要做什么更改?
发布于 2012-08-22 19:26:15
这里的问题是,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)
}
}
}在我的机器上,这给出了一个640px宽,约960px高的帧-这可能是你想要的。
发布于 2012-08-22 22:31:48
正如Rogach所说,问题是你没有改变底层的同级。这样做的另一种可能性是:
class Foo extends Panel {
preferredSize = new Dimension(32, 32)
}https://stackoverflow.com/questions/12071410
复制相似问题