Как 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)
}
}
Но результат слишком мал:
Видимо, ни один из 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)
}