gpt4 book ai didi

java - setCellFactory 覆盖 updateItem 并换行文本

转载 作者:行者123 更新时间:2023-12-02 11:15:45 27 4
gpt4 key购买 nike

我希望 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/

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