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和换行文本的主要内容,如果未能解决你的问题,请参考以下文章