3

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

但结果太小了:

测试2

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

4

2 回答 2

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 像素高的框架——这可能是你想要的。

于 2012-08-22T11:26:15.343 回答
2

正如 Rogach 所说,问题是你没有改变底层的对等点。这样做的另一种可能性如下:

class Foo extends Panel {
   preferredSize = new Dimension(32, 32)
}
于 2012-08-22T14:31:47.813 回答