setCellFactory覆盖updateItem和换行文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setCellFactory覆盖updateItem和换行文本相关的知识,希望对你有一定的参考价值。

我希望listView中的项目全部大写并且有换行符。

我正在使用setCellFactory来提供Cell.updateItem的实现。这很好用。当我将ListView中的行分解为我的ListCell实现时,只有两个“功能”中的一个有效。第一个代码块从第25行开始,到第33行结束。第二个代码块从第35行开始,到第42行结束。当我注释掉第二个块时,ListView中的字符串都是大写的,没有换行符。当它没有被注释掉时,字符串有换行符并不是全部大写。我希望这两个“功能”都有效。我怎样才能做到这一点?

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) {
            return new ListCell<String>() {

                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null || item == null) {
                        setText(null);
                    } else {
                        setText(item.toUpperCase());
                    }
                }

                {
                    Text text = new Text();
                    text.wrappingWidthProperty().bind(list.widthProperty().subtract(15));
                    text.textProperty().bind(itemProperty());

                    setPrefWidth(0);
                    setGraphic(text);
                }


            };
        }
    });


    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("ListWrapBug");
    primaryStage.show();
}

}

刹车线的解决方法:JavaFX: setWrapText(true) (WordWrap) doesn't work in ListView

不幸的是,SO代码视图没有行数。

答案

无需同时设置单元格的文本,并将图形设置为包含所需文本的文本对象。做一个或另一个。所以,例如,您可以这样做:

myList.setCellFactory(list -> new ListCell<String>() {

    {
        setWrapText(true);
        prefWidthProperty().bind(list.widthProperty().subtract(12));
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null || item == null) {
            setText(null);
        } else {
            setText(item.toUpperCase());
        }
    }
});

或者你可以这样做:

myList.setCellFactory(list -> new ListCell<String>() {

    private Text text = new Text();

    {
        prefWidthProperty().bind(widthProperty().subtract(12));
        text.wrappingWidthProperty().bind(widthProperty());
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null || item == null) {
            setGraphic(null);
        } else {
            text.setText(item.toUpperCase());
            setGraphic(text);
        }
    }
});

从单元格的宽度中减去12对于垂直滚动条来说是一个黑客攻击;可能有更清洁的方法来做到这一点。

以上是关于setCellFactory覆盖updateItem和换行文本的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 8,带有复选框的 ListView

如何在 MongoDB 中查找文档、更新文档并插入新文档?

如何在 MongoDB 中查找文档、更新文档并插入新文档?

JavaFX TextFieldTableCell-替代显示功能

在 CheckListView JavaFX 上实现全选

TableView:填充可编辑的 TextField 容器