java - setCellFactory 覆盖 updateItem 并换行文本

标签 java javafx

我希望 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 代码 View 没有行数。

最佳答案

不需要同时设置单元格的文本,将图形设置为包含所需文本的文本对象。做其中之一或另一个。因此,例如,您可以这样做:

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 来计算垂直滚动条有点麻烦;可能有更干净的方法来做到这一点。

关于java - setCellFactory 覆盖 updateItem 并换行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296723/

相关文章:

java - Android 在切换到新 Activity 时崩溃

java - 如何使用 Java 的 String.replaceAll 方法替换加号

java - CXF 未将父类(super class)添加到生成的类中

javafx-2 - Javafx PropertyValueFactory 不填充 Tableview

javafx - 将 AnchorPanes 添加到 ScrollPanes Javafx 8

java - 创建 JavaFX Video Player 类的实例

java - 如何在 Java 中解析时间?

java - 数组在 Java 中是线程安全的吗?

java - 需要帮助将链接列表实现到 TableView javaFX 并将其保存到文件中

java - JavaFX 中的一段自由流动文本是否可以有一个链接?