Как 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"))
    }
  }
}

Каждая содержащаяся метка отображается точно такой же большой, как и должна быть:

тестовое задание

Теперь я хочу заменить 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 ответа

Решение

Проблема здесь в том, что 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 пикселей в высоту - что, вероятно, то, что вы хотите.

Как сказал Рогач, проблема в том, что вы не меняете основного партнера. Другая возможность сделать это заключается в следующем:

class Foo extends Panel {
   preferredSize = new Dimension(32, 32)
}
Другие вопросы по тегам