Javafx 表格单元格内的文本流:单元格高度不正确
我习惯于将格式化文本放在JavaFX表中。首先,我试图嵌入一个网络视图,但我的手机高度有问题。这似乎是JavafX中的一个任务特性(请参阅:) 根据这里的建议,我尝试嵌入一个文本流。然而,TabelCell的大小也不正确。我希望行的高度也一样大,单元格的内容也能放进去。更改列宽应导致更改行高 下面是我的最小运行示例Javafx 表格单元格内的文本流:单元格高度不正确,javafx,textflow,Javafx,Textflow,我习惯于将格式化文本放在JavaFX表中。首先,我试图嵌入一个网络视图,但我的手机高度有问题。这似乎是JavafX中的一个任务特性(请参阅:) 根据这里的建议,我尝试嵌入一个文本流。然而,TabelCell的大小也不正确。我希望行的高度也一样大,单元格的内容也能放进去。更改列宽应导致更改行高 下面是我的最小运行示例 import javafx.application.Application; import javafx.collections.FXCollections; import java
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; }
}
}
导入javafx.application.application;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.ContentDisplay;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.layout.Region;
导入javafx.scene.paint.Color;
导入javafx.scene.text.text;
导入javafx.scene.text.TextFlow;
导入javafx.stage.stage;
公共类TableViewSample扩展了应用程序{
private final ObservableList data=FXCollections.observableArrayList(新MyData(1L)、新MyData(3L)、新MyData(2L)、新MyData(4L)、新MyData(1L));
公共静态void main(最终字符串[]args){
发射(args);
}
@凌驾
公共作废开始(最后阶段){
最终场景=新场景(新组());
TableView table=新TableView();
最终表列名称col=新表列(“So”);
名称列设置最小宽度(200);
nameCol.setCellValueFactory(新属性ValueFactory(“i”);
//允许在列中显示文本流
nameCol.setCellFactory(列->{
返回新的TableCell(){
@凌驾
受保护的void updateItem(长项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
设置样式(“”);
}否则{
//生成具有可变长度的Textflow
TextFlow TextFlow=新的TextFlow();
textFlow.setPrefHeight(Region.USE\u COMPUTED\u SIZE);
对于(Long ii=1L;iiTableView,增加单元格中每个文本节点的单元格高度。如果使用TextFlow组件,则行会增加自身的高度,就像每个字母位于单独的行中一样
我不知道如何防止这种虫子
我可以建议您在单元格中只使用一个文本节点,或者使用ListView代替TableView。此组件没有此缺点。我在应用程序中遇到了相同的问题,并认为这是FX代码中的一个错误。调试JDK代码后,我终于了解了问题的来源
在渲染过程中,TextFlow
将被要求提供其首选高度(给定宽度为-1)。然后,TextFlowLayout
将返回高度,就好像它必须在一个非常窄的列中显示所有内容一样,从而导致首选高度与TextFlow对象。由于行的高度在TableView
或TreeTableView
中没有限制,因此表将分配TextFlow
对象的首选高度,从而产生上述奇怪的外观
通过将单元格的首选高度设置为textFlow
的高度,并在宽度上添加一个ChangeListner
,以适应单元格宽度变化时的高度,可以解决此问题
setPrefHeight(textFlow.prefHeight(nameCol.getWidth()) + 4);
nameCol.widthProperty().addListener((v, o, n) ->
setPrefHeight(textFlow.prefHeight(n.doubleValue()) + 4));
当我尝试使用TextFlow作为工具提示中的图形时,这种方法非常有效。尽管我发现我不需要添加+4填充,而且我可以将初始pref height设置为任何值。