Разрыв базовой линии с помощью GroupLayout и вложенных панелей - PullRequest
2 голосов
/ 27 июля 2011

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

Так как Scala Swing на удивление не имеет GroupPanel, я использую один из Andreas Flierl , но это не должно быть важным, так как я уверен, что это проблема базового свинга классы и как их обусловить.

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()
}

Обратите внимание на скриншот, как внутренняя панель выровнена с основанием, а не с базовой линией. Эта проблема не зависит от менеджера компоновки, используемого для дочерней панели (это может быть другая компоновка группы).

screenshot

1 Ответ

0 голосов
/ 28 июля 2011

Кажется, 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()
}
...