gpt4 book ai didi

javafx - Tablecell 内的文本流 : not correct cell height

转载 作者:行者123 更新时间:2023-12-04 02:06:35 24 4
gpt4 key购买 nike

我不会将格式化文本放在 JavaFX 表格中。首先,我试图嵌入一个 Webview,但我遇到了单元格高度问题。这似乎是 JavafX 中的一项任务功能(参见:Java FX: TableView - display simple HTML)。

根据此处的建议,我尝试嵌入一个 TextFlow。然而,TabelCell 的大小再次不正确。我希望行的高度一样大,单元格的内容适合里面。更改列宽应导致更改行高。

这是我的最小运行示例。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class TableViewSample extends Application {


private final ObservableList<MyData> data = FXCollections.observableArrayList(new MyData(1L), new MyData(3L), new MyData(2L), new MyData(4L), new MyData(1L));

public static void main(final String[] args) {
launch(args);
}

@Override
public void start(final Stage stage) {
final Scene scene = new Scene(new Group());

TableView<MyData> table = new TableView<>();

final TableColumn<MyData, Long> nameCol = new TableColumn("So So");
nameCol.setMinWidth(200);
nameCol.setCellValueFactory(new PropertyValueFactory<>("i"));

// Allow to display Textflow in Column

nameCol.setCellFactory(column -> {
return new TableCell<MyData, Long>() {
@Override
protected void updateItem(Long item, boolean empty) {
super.updateItem(item, empty);

if (item == null || empty) {

setText(null);
setStyle("");

} else {

// Generate Textflow with variable length

TextFlow textFlow = new TextFlow();
textFlow.setPrefHeight(Region.USE_COMPUTED_SIZE);

for (Long ii = 1L; ii <= item; ii++) {
Text text1 = new Text("la la la ");
text1.setFill(Color.RED);

Text text2 = new Text("blue blue blue ");
text2.setFill(Color.BLUE);
textFlow.getChildren().add(text1);
textFlow.getChildren().add(text2);


}

setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(textFlow);
// setPrefHeight(20); // <- Shows the expected effect.
// However I want to have variable height of row.
setPrefHeight(Region.USE_COMPUTED_SIZE); // <- Why is that not working

}
}
};
});



table.setItems(data);
table.getColumns().addAll(nameCol);

((Group) scene.getRoot()).getChildren().addAll(table);

stage.setScene(scene);
stage.show();
}

public static class MyData {
private Long i;
public MyData(Long i) { this.i = i; }
public Long getI() { return i; }
}

}

如您所见,行高太大了。有什么建议么? enter image description here

最佳答案

我在一个应用程序中遇到了同样的问题,并认为这是 FX 代码中的错误。调试JDK代码后,我终于明白问题出在哪里了。

在呈现 TextFlow 期间,将询问其首选高度,给定宽度 -1。 TextFlowLayout 将返回高度,就好像它必须在极窄的列中显示所有内容一样,从而导致首选高度与 TextFlow 中的字符数成正比> 对象。因为行的高度在 TableViewTreeTableView 中没有限制,所以表格将分配 TextFlow 对象的首选高度,导致奇怪外观如上。

可以通过将单元格的首选高度设置为 textFlow 的高度并在宽度上额外添加一个 ChangeListner 来解决这个问题,如果单元格的宽度发生变化。

setPrefHeight(textFlow.prefHeight(nameCol.getWidth()) + 4);

nameCol.widthProperty().addListener((v, o, n) ->
setPrefHeight(textFlow.prefHeight(n.doubleValue()) + 4));

关于javafx - Tablecell 内的文本流 : not correct cell height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42855724/

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