JavaFX-表格列图形高于其他行
我正在用JavaFX制作一张桌子。每行都有文本。一行有一个图形,因为该单元格的文本有多种颜色 该代码仅在特定条件为真时适用(该部分有效):JavaFX-表格列图形高于其他行,java,javafx,graphic,tablecolumn,Java,Javafx,Graphic,Tablecolumn,我正在用JavaFX制作一张桌子。每行都有文本。一行有一个图形,因为该单元格的文本有多种颜色 该代码仅在特定条件为真时适用(该部分有效): departTimeCol.setCellFactory(列->新表单元格(){ @凌驾 受保护的void updateItem(字符串项,布尔值为空){ super.updateItem(项,空); setText(项目); 如果(项!=null&&!空){ 如果(项匹配(“^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\
departTimeCol.setCellFactory(列->新表单元格(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
setText(项目);
如果(项!=null&&!空){
如果(项匹配(“^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]\\s\\\+[\\d]”){
Text timeText=新文本(item.split(“”[0]。trim()+“”);
Text delayText=新文本(item.split(“”[1].trim());
delayText.setFill(颜色为红色);
TextFlow flow=新的TextFlow(timeText,delayText);
setText(空);
设定图形(流量);
}
}
}
});
结果是:
红色+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);
}
}
}
});
您还可以使用Pattern
+Matcher
和捕获组,在同一步骤中解析输入并匹配它。这样你也不会有上述问题
谢谢您的回答。我尝试了您的解决方案,但+2不会变为红色:/
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);
}
}
}
});
System.out.println("a\tb".matches(".\\s."));
System.out.println("a\tb".split(" ")[1]);