gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:26:38 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com