作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望 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/
我是一名优秀的程序员,十分优秀!