gpt4 book ai didi

swing - GridPanel 是如何确定大小的?

转载 作者:行者123 更新时间:2023-12-01 10:59:53 27 4
gpt4 key购买 nike

这是一个非常简单的 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"))
}
}
}

每个包含的标签都显示为它需要的大小:

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)
}
}

但是结果太小了:

test2

显然,没有调用任何 xxxSize 方法,因为该程序不产生控制台输出。我究竟需要更改什么才能使每个 Foo 都以 32x32 像素的大小显示?

最佳答案

这里的问题是 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 像素高的框架 - 这可能是您想要的。

关于swing - GridPanel 是如何确定大小的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12071410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com