[英]JavaFX - TableColumn graphic higher than other rows
我正在用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);
}
}
}
});
結果是:
帶紅色+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);
}
}
}
});
請注意,代碼中還有一些應修復的問題:
String
不再與正則表達式匹配或單元格為null
,也絕不能將圖形設置為null
。 這意味着您可以將TableCell
為text
屬性不為空且graphic
包含TextFlow
。 注意:始終確保單元格外觀的狀態正確,無論是否updateItem
調用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
並捕獲組來在同一步驟中解析輸入並進行匹配。 這樣,您也不會遇到上述問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.