2

レイアウトマネージャーとしてMigLayoutを使用するコンポーネントがあります。JScrollPane内で拡大して、使用可能な幅全体を占めるように設定されています。したがって、アプリケーションのフレームのサイズを変更すると、JScrollPaneはフレームと同じ幅になり、内部コンポーネントも同じようになります。

ただし、フレームを縮小すると、JScrollPane内の拡大されたコンポーネントはその幅を維持し、縮小されないため、水平スクロールバーが表示されます。

JScrollpaneはその幅を縮小する必要があることを認識しており、getScrollableTracksViewportWidth = trueを使用してScrollable-Interfaceを実装しましたが、MigLayoutはそれを尊重していないようです。

何かアドバイス?ありがとう

4

1 に答える 1

3

私は次のscala-snippetでそれを解決しました。ScalaのScrollableは単なる偽のラッパーであり、Java-Scrollableを実装することになっています...

import javax.swing.JPanel
import javax.swing.{Scrollable => JScrollable}
import javax.swing.BoxLayout
import java.awt.Dimension
import java.awt.Rectangle
import scala.swing.SequentialContainer
import scala.swing.Orientation
import scala.swing.Scrollable
import scala.swing.Panel

class ScrollablePanel extends Panel with SequentialContainer.Wrapper with Scrollable.Wrapper {

  var scrollIncrement: Int = 10
  var blockScrollIncrement: Int = 50

  val allowVerticalScrolling: Boolean   = true
  val allowHorizontalScrolling: Boolean = false

  override lazy val peer = new JPanel with SuperMixin with JScrollable {
    def getPreferredScrollableViewportSize: Dimension =
      getPreferredSize

    def getScrollableTracksViewportHeight: Boolean =
      !allowVerticalScrolling

    def getScrollableTracksViewportWidth: Boolean =
      !allowHorizontalScrolling

    def getScrollableBlockIncrement(visibleRect: Rectangle, orientation: Int, direction: Int): Int =
      scrollIncrement

    def getScrollableUnitIncrement(visibleRect: Rectangle, orientation: Int, direction: Int): Int =
      blockScrollIncrement
  }

  final protected def scrollablePeer: JScrollable = peer
}
于 2012-01-30T22:00:12.497 に答える