代码之家  ›  专栏  ›  技术社区  ›  user2051561

JavaFX8:调整ListView单元格的高度以适应其滚动条

  •  0
  • user2051561  · 技术社区  · 6 年前

    我有一个 ListView (水平方向)使用 ListCell 以显示其项目。这些细胞是 Canvas 是的。当列表中有足够的项时,垂直和水平 ScrollBar 被激活。发生这种情况时,单元格的部分内容将被水平滚动条剪裁(在底部)。

    我们如何设置(或调整)列表视图的高度,以便当滚动条出现时不会发生剪切?它们是一种检测滚动条何时可见的方法吗?我们能确定滚动条的高度并简单地使列表的高度足够高吗?

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

    短暂性脑缺血发作

    0 回复  |  直到 6 年前
        1
  •  0
  •   user2051561    6 年前

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