JavaFX 8:使ListView单元格的高度适应其ScrollBar

时间:2019-03-09 22:03:39

标签: listview javafx-8 scrollbar listcellrenderer clipped

我有一个ListView(水平方向),它使用ListCell来显示其物品。这些单元格是Canvas。当列表中放置了足够多的项目时,将激活垂直{{1}和水平ScrollBar。发生这种情况时,水平滚动条会将单元格的部分内容(在底部)剪切掉。

我们如何设置(或调整)列表视图的高度,以便在滚动条出现时不会发生剪裁?他们是否有办法检测滚动条何时可见?我们可以确定滚动条的高度并简单地使列表的高度足够高吗?

我已经尝试了通过列表视图和列表视图单元格中的更改侦听器使用多种方法。但是这些似乎不起作用。

TIA

1 个答案:

答案 0 :(得分:0)

我想出了以下解决方案:添加一个事件侦听器-每次添加,删除或替换元素时,都要调整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)
        })
      }
    })