You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX ListView实现文本大写与自动换行的问题求助

解决ListView项同时实现全大写与自动换行的问题

你的核心问题在于同时混用了setText()和setGraphic():当你给ListCell设置了Graphic(也就是那个用于换行的Text节点)后,Cell的text属性会被完全忽略,所以你在updateItem里写的setText(item.toUpperCase())根本不会显示;反过来注释掉Graphic的代码,setText能生效,但又失去了换行能力。

要让两个功能同时生效,我们需要统一用那个Text节点来处理文本显示——既让它负责换行,又让它显示转成大写的内容。修改后的代码如下:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        ListView<String> myList = new ListView<>();
        myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
            @Override
            public ListCell<String> call(final ListView<String> list) {
                // 把Text节点提升为内部类成员,方便updateItem访问
                final Text textNode = new Text();
                // 绑定换行宽度,保持原逻辑
                textNode.wrappingWidthProperty().bind(list.widthProperty().subtract(15));

                return new ListCell<String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);

                        if (empty || item == null) {
                            // 空项时清空Graphic,避免残留内容
                            setGraphic(null);
                        } else {
                            // 直接更新Text节点的文本为大写形式
                            textNode.setText(item.toUpperCase());
                            // 设置Graphic为这个Text节点
                            setGraphic(textNode);
                        }
                    }
                };
            }
        });

        // 添加测试数据
        for (int i = 0; i < 100; i++) {
            myList.getItems().add(
                "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " +
                "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
                "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " +
                "nisi ut aliquip ex ea commodo consequat."
            );
        }

        primaryStage.setScene(new Scene(myList));
        primaryStage.setTitle("ListWrapFixed");
        primaryStage.show();
    }
}

关键改动说明:

  • 将用于换行的Text节点从初始化块移到外部,作为内部类的成员变量,这样在updateItem方法里可以直接修改它的文本内容
  • 不再使用setText(),而是直接给Text节点设置转成大写的文本,同时保持它的wrappingWidth绑定,确保换行生效
  • 处理空项时,把Cell的Graphic设为null,避免旧的文本内容残留

这样修改后,ListView的项就能同时实现全大写显示和自动换行的效果了。

内容的提问来源于stack exchange,提问作者Osvald Laurits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:36