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 に答える