2

メインレイアウトに使用GroupLayoutしていますが、内部パネルを追加するまで、ベースラインの配置は正常に機能します。ベースラインはこれらのパネルを介して伝播されていないようです。パネルに直接追加されたすべてのボタン、ラベルなどはGroupLayout、ベースラインに対して適切に位置合わせされていますが、内側のパネル内のコンポーネントはそうではありません。

Scala Swingには意外にもがないので、Andreas FlierlGroupPanelのものを使用していますが、基礎となるSwingクラスとそれらを調整する方法の問題であると確信しているので、それは重要ではありません。

import swing._
import eu.flierl.grouppanel.GroupPanel

val f = new Frame {
  contents = new GroupPanel {
    val but = new Button { text = "button" }
    val lb  = new Label  { text = "label"  }
    val inner = new FlowPanel {
       contents += new Button { text = "ibut" }
       contents += new Label  { text = "ilab" }
    }
    theHorizontalLayout is Sequential        (but, lb, inner)
    theVerticalLayout   is Parallel(Baseline)(but, lb, inner)
  }
  centerOnScreen()
  pack()
  open()
}

スクリーンショットでは、内側のパネルがベースラインではなく下部にどのように配置されているかに注意してください。この問題は、子パネルに使用されるレイアウトマネージャーとは無関係です(別のグループレイアウトである可能性があります)。

スクリーンショット

4

1 に答える 1

0

getBaseline基になるピアのオーバーライドが必要なようです。残念ながら、Scala Swingにはそのためのフックがありません(おそらくJava 1.6に依存するためですか?)

val f = new Frame {
  contents = new GroupPanel {
    val but = new Button { text = "button" }
    val lb  = new Label  { text = "label"  }
    val inner = new FlowPanel {
      val b = new Button { text = "ibut" } 
      override lazy val peer: javax.swing.JPanel =
        new javax.swing.JPanel(new java.awt.FlowLayout(1)) with SuperMixin {
          override def getBaseline(w: Int, h: Int): Int =
            b.peer.getBaseline(w, h) + getInsets().top
        }
      // vGap = 0
      contents += b
      contents += new Label { text = "ilab" }
    }
    theHorizontalLayout is Sequential(but, lb, inner)
    theVerticalLayout is Parallel(Baseline)(but, lb, inner)
  }
  centerOnScreen()
  pack()
  open()
}
于 2011-07-27T23:12:28.830 に答える