JavaFX 8: Адаптация высоты ячейки ListView к ее полосе прокрутки - PullRequest
0 голосов
/ 10 марта 2019

У меня есть ListView (горизонтальная ориентация), который использует ListCell, чтобы показать свои предметы. Эти клетки Canvas. Когда в список помещено достаточное количество элементов, активируются вертикальная и горизонтальная ScrollBar. Когда это происходит, часть содержимого ячейки обрезается (внизу) горизонтальной полосой прокрутки.

Как мы можем установить (или адаптировать) высоту представления списка, чтобы при появлении полосы прокрутки не происходило отсечение? Это способ определить, когда полоса прокрутки становится видимой? Можем ли мы определить высоту полосы прокрутки и просто сделать высоту списков достаточно высокой?

Я пробовал несколько подходов с помощью прослушивателей изменений в представлении списка и ячейке представления списка. Но это не похоже на работу.

1011 * ТИА *

1 Ответ

0 голосов
/ 16 марта 2019

Я пришел к следующему решению: добавить прослушиватель событий - каждый раз, когда элемент добавляется, удаляется или заменяется, изменяйте высоту ListView. При изменении размера чека у вас есть только вертикальная и / или горизонтальная полоса прокрутки. Если существует только вертикальная полоса прокрутки, используйте ее высоту и вставки, чтобы получить высоту ячейки. Если горизонтальная полоса прокрутки также существует, добавьте ее высоту (высоту большого пальца). Вот соответствующий фрагмент кода (в Scala):

  def extendHeight(thumbnails: ListView[String], vertical: Option[ScrollBar], horizontal: Option[ScrollBar]): Unit = {
    (vertical, horizontal) match {
      case (None, None) => ()
      case (None, Some(_)) => ()
      case (Some(v), None) =>
        resizeHeight(thumbnails, v, 0)
      case (Some(v), Some(h)) =>
        val extra = if (h.isVisible) h.getHeight else 0
        resizeHeight(thumbnails, v, extra)
    }
  }

  def resizeToFrame(thumbnails: ListView[String]): Unit = {
    val (vertical, horizontal) = PStoryBoardUX.getScrollBars(thumbnails)
    PStoryBoardUX.extendHeight(thumbnails, vertical, horizontal)
  }

thumbnails.getItems.addListener( new ListChangeListener[String] {
      override def onChanged(c: Change[_ <: String]): Unit = {
        javafx.application.Platform.runLater( () => {

          // At thus point in time the scrollbars have not been updated
          // So we don't know if they will be active or not. Force this
          thumbnails.layout()
          // Now resize to remove the visible scrollbars
          resizeToFrame(thumbnails)
        })
      }
    })
...