GridPanel如何确定大小?

时间:2012-08-22 10:46:55

标签: swing scala grid-layout gridpanel

这是一个非常简单的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像素?

2 个答案:

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