java - 如何在 JavaFX 中的 ListView 中缩放标签

标签 java listview javafx layout scroll

我有一个 ListView,其中有一些标签。标签的 width 属性绑定(bind)到 ListView 的 width 属性,但它们似乎稍大,这意味着 ListView 上显示水平滚动条。我想要的是将标签放入 ListView 中,而底部没有滚动条。我查看了标签和 ListView 上的各种填充和插入值,但我发现没有一个是罪魁祸首(大多数为零)。

enter image description here

这是一个演示该问题的示例。

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class ListViewScrollExample extends Application {

   private ListView<Node> listView;

   @Override
   public void start(Stage stage) throws Exception {
       listView = new ListView<>();
       addItem("Some quite long string to demonstrate the problem");

       Scene scene = new Scene(listView);
       stage.setScene(scene);
       stage.show();
    }

    public void addItem(String item) {
        Label label = new Label(item);
        label.setWrapText(true);
        label.maxWidthProperty().bind(listView.widthProperty());
        listView.getItems().add(label);
    }

    public static void main(String[] args){
        Application.launch(args);
    }

}

最佳答案

default CSS fileListCell 添加填充(当前版本中的第 2316 行):

.list-cell {
    -fx-padding: 0.25em 0.583em 0.25em 0.583em; /* 3 7 3 7 */
}

使用 Node 实例作为支持 ListView 的数据通常是个坏主意:在此示例中您应该使用 String,并使用单元工厂创建一个标签,显示根据需要配置的字符串。以下似乎适用于您的示例:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class ListViewScrollExample extends Application {

   private ListView<String> listView;

   @Override
   public void start(Stage stage) throws Exception {
       listView = new ListView<>();
       listView.getItems().add("Some quite long string to demonstrate the problem");

       listView.setCellFactory(lv -> {
           ListCell<String> cell = new ListCell<String>() {

               private Label label = new Label();
               {
                   label.setWrapText(true);
                   label.maxWidthProperty().bind(Bindings.createDoubleBinding(
                           () -> getWidth() - getPadding().getLeft() - getPadding().getRight() - 1, 
                           widthProperty(), paddingProperty()));
                   setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
               }

               @Override
               protected void updateItem(String item, boolean empty) {
                   super.updateItem(item, empty);
                   if (empty) {
                       setGraphic(null);
                   } else {
                       label.setText(item);
                       setGraphic(label);
                   }
               }
           };
           return cell ;
       });

       Scene scene = new Scene(listView);
       stage.setScene(scene);
       stage.show();
    }


    public static void main(String[] args){
        Application.launch(args);
    }

}

List view at default width List view at wider width List view at narrow width

这里我创建了一个列表单元格,它将标签显示为其图形,并将标签的文本设置为要显示的字符串。单元格的构造函数将标签的最大宽度绑定(bind)到单元格的宽度,减去填充所需的空间。对 setContentDisplay(ContentDisplay.GRAPHIC_ONLY) 的调用似乎是必要的,因此单元格不会尝试为文本分配任何空间。

可以通过直接在列表单元格上设置文本并在单元格上调用 setWrapText(true) 来实现此目的(毕竟,它也是 Labeled 的子类) ),但我无法让它以这种方式工作。

关于java - 如何在 JavaFX 中的 ListView 中缩放标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45510443/

相关文章:

java - Azure Spring Boot - 获取登录用户的 OAuth 2.0 访问 token

python - ListView中的Django GET表单和上下文修改

java - 聚焦时如何更改javafx中的菜单颜色

Java 数据库连接

java - 使用 Java Streams 按属性将对象列表组合在一起,并将它们缩减为具有另一个属性平均值的新对象列表

ios - Titanium:向 listView 添加一个 ActivityIndi​​cator?

android - 如何给ListView添加页眉和页脚(Android XE5)

JavaFX WebViewer 在 Java 6 上?

java - 监听器移除

java - WebDriver findElements 在检索时是否保留表行顺序