2017-09-16 73 views
0

一个小的图形烦恼,但我有一个ListView设置为显示自定义对象的设置高度超过默认值。我试图使用setFixedCellSize(),它在大多数用途中完美地工作,但在某些情况下,某些单元的单元高度可能会根据用户交互而增长和缩小。ListView设置虚拟行高度

class Example extends Label { 
    private boolean change = true; 
    public Example(String text) { 
     super(text); 
     setMinHeight(150); 
     setPrefHeight(150); 
     setMaxHeight(150); 
     Hyperlink link = new Hyperlink("Change"); 
     setGraphic(link); 
     link.setOnAction(ae -> { 
      change = !change; 
      if(change) { 
       setMinHeight(80); 
       setPrefHeight(80); 
       setMaxHeight(80); 
      } else { 
       setMinHeight(180); 
       setPrefHeight(180); 
       setMaxHeight(180); 
      } 
     }); 
    } 
} 

ListView<Node> list = new ListView<>(); 
list.setFixedCellSize(150); 
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
list.getItems().addAll(new Example("Hello world"), new Example("12345")); 

在我上面的例子中,当点击超链接时,标签改变高度。当添加setFixedCellSize()时,它不再执行此操作。是否有另一种方式实现改变虚拟行的相同效果,但允许自定义节点改变高度?

回答

1

您可以设置自定义的电池工厂,设置基于单元的状态所需的高度(我假设通过“虚拟细胞”你的意思是空单元格):

ListView<String> lv = new ListView<>(); 
lv.setCellFactory(lst -> 
     new ListCell<String>() { 
      @Override 
      protected void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 
       if (empty) { 
        setPrefHeight(45.0); 
        setText(null); 
       } else { 
        setPrefHeight(Region.USE_COMPUTED_SIZE); 
        setText(item); 
       } 
      } 
     }); 
lv.getItems().addAll("Hello", "World"); 

这将导致非-empty细胞具有其优选尺寸(根据所述内容,在这种情况下它只是字符串),而空的单元将具有其优选尺寸为45.

Illustration