gpt4 book ai didi

JavaFX - TableColumn 图形高于其他行

转载 作者:行者123 更新时间:2023-12-01 09:03:05 24 4
gpt4 key购买 nike

我正在使用 JavaFX 制作表格。每行都有文字。一行有一个图形,因为该单元格的文本有多种颜色。

该代码仅在特定条件为真时才适用(该部分有效):

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);

setText(item);

if(item != null && ! empty){
if(item.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s\\+[\\d]")) {
Text timeText = new Text(item.split(" ")[0].trim() + " ");
Text delayText = new Text(item.split(" ")[1].trim());

delayText.setFill(Color.RED);

TextFlow flow = new TextFlow(timeText, delayText);

setText(null);
setGraphic(flow);

}
}
}
});

结果是:

Result

带有红色+2的行是图形。所有其他行都包含文本。我怎样才能给包含图形的行相同的高度?

最佳答案

只需将首选高度设置为 0 即可使高度恰好是存储文本所需的高度。

Pattern pattern = Pattern.compile("((?:[0-9]|[01][0-9]|2[0-3]):[0-5][0-9]\\s)(\\+\\d)");

departTimeCol.setCellFactory(column -> new TableCell<Ride, String>() {

private final Text timeText = new Text();
private final Text delayText = new Text();
private final TextFlow flow = new TextFlow(timeText, delayText);

{
delayText.setFill(Color.RED);
flow.setPrefHeight(0);
flow.heightProperty().addListener((observable, oldValue, newValue) -> {
this.setMinHeight(newValue.doubleValue() + 4);
});
flow.setMinHeight(Region.USE_COMPUTED_SIZE);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
setGraphic(flow);
}

@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);

if (empty || item == null) {
timeText.setText("");
delayText.setText("");
delayText.setVisible(false);
} else {
Matcher m = pattern.matcher(item);
if (m.matches()) {
timeText.setText(m.group(1));
delayText.setText(m.group(2));
delayText.setVisible(true);
} else {
timeText.setText(item);
delayText.setText("");
delayText.setVisible(false);
}
}

}
});

请注意,代码中还有一些问题需要修复:

  • 即使字符串不再与正则表达式匹配或者单元格变为空,您也永远不会将图形设置回null。这意味着您可以使 TableCell 进入 text 属性不为空且 graphic 包含 TextFlow 的状态>。 注意:无论 updateItem 方法被调用多少次并且与传递的参数无关,始终确保单元格外观的状态正确。
  • 通过对一种情况使用 graphic + TextFlow 和对另一种情况使用 text 属性,您可以产生不一致的外观。 (只需看一下屏幕截图中文本的最左侧部分即可!它们没有正确对齐)。
  • 使用Cell的全部目的是重用节点以防止不必要的节点创建。您通过重新创建 TextFlow 等破坏了这次尝试。在 updateItem 方法中,而不是重用这些节点。
  • 正则表达式不需要以 ^ 开头,因为 matches 已经确保整个输入匹配。此外,用于 split 的分隔符在正则表达式中没有完全相同的分隔符。除了之外,还有其他空格字符,例如制表符。只需检查以下代码的作用...

    System.out.println("a\tb".matches(".\\s."));
    System.out.println("a\tb".split(" ")[1]);

    您还可以使用 Pattern+Matcher 和捕获组在同一步骤中解析输入并进行匹配。这样您也不会遇到上述问题。

关于JavaFX - TableColumn 图形高于其他行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41521973/

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