JavaFX
TableView
에 표시된 텍스트의 일부를 강조하고 싶습니다. 지금까지 Text
개체를 TextFlow
개체에 사용하고 있습니다. 텍스트의 특정 부분을 강조 표시하려면 다음 코드로 강조 표시하거나 강조 표시하지 않을 부분 (javafx.scene.text
개)의 텍스트를 잘라 내기 위해 태그를 사용하고 있습니다.강조 표시된 텍스트가있는 JavaFX TableView
col3.setCellValueFactory(new PropertyValueFactory<RegexMatch, String>("text"));
col3.setCellFactory(new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn param) {
TableCell cell = new TableCell() {
@Override
protected void updateItem(Object text, boolean empty) {
if (text != null && text instanceof String) {
String str = (String) text;
TextFlow flow = new TextFlow();
if (txtSearchField.getText().length() > 3 && str.contains(HIGHLIGHT_START)) {
// Something to highlight
flow.getChildren().clear();
while (str.contains(HIGHLIGHT_START)) {
// First part
Text starttext = new Text(str.substring(0, str.indexOf(HIGHLIGHT_START)));
starttext.setWrappingWidth(Double.MAX_VALUE);
flow.getChildren().add(starttext);
str = str.substring(str.indexOf(HIGHLIGHT_START) + HIGHLIGHT_START.length(), str.length());
// Part to highlight
Text highlightedText = new Text(str.substring(0, str.indexOf(HIGHLIGHT_END)));
highlightedText.setStyle("-fx-text-background-color: yellow;");
highlightedText.setFill(Color.BLUE);
highlightedText.setWrappingWidth(Double.MAX_VALUE);
flow.getChildren().add(highlightedText);
// Last part
str = str.substring(str.indexOf(HIGHLIGHT_END) + HIGHLIGHT_END.length(), str.length());
if (!str.contains(HIGHLIGHT_START)) {
Text endtext = new Text(str);
endtext.setWrappingWidth(Double.MAX_VALUE);
flow.getChildren().add(endtext);
}
}
}else if (txtSearchField.getText().length() < 1) {
// Remove former highlightings and show simple text
str = str.replaceAll(HIGHLIGHT_START, "");
str = str.replaceAll(HIGHLIGHT_END, "");
flow.getChildren().clear();
Text textModule = new Text(str);
textModule.setWrappingWidth(Double.MAX_VALUE);
flow.getChildren().add(textModule);
} else {
// show simple text
flow.getChildren().clear();
Text textModule = new Text(str);
textModule.setWrappingWidth(Double.MAX_VALUE);
flow.getChildren().add(textModule);
}
flow.setPrefHeight(bigIcons ? BIG_SIZE : SMALL_SIZE);
setGraphic(flow);
}
}
};
return cell;
}
});
불행히도 배경 강조 표시가 작동하지 않고 그림과 같이 이상한 줄무늬가 있습니다. 텍스트에 줄 바꿈이 없습니다. (화질 죄송합니다, 자사의 실제 스크린 샷 :)
어떤 도움에 감사드립니다.
솔루션
는 @eckig 각 '라벨'자신의 배경 색상을 가질 수 있고 필요에 따라이 HBox
에 많은 Labels
라인을 사용할 수 있기 때문에하는 HBox
에 좋은 생각을 여러 Labels
입니다 사용하여, 제안으로 : -fx-text-background-color
를 변경하면 거기에 영향을주지 않는 이유가 그래서 this에 따르면
col3.setCellValueFactory(new PropertyValueFactory<RegexMatch, String("excerptLineTable"));
col3.setCellFactory(new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn param) {
TableCell cell = new TableCell() {
@Override
protected void updateItem(Object text, boolean empty) {
if (text != null && text instanceof String) {
HBox hbox = new HBox();
String str = (String) text;
if (txtSearchField.getText().length() > 3 && str.contains(HIGHLIGHT_START)) {
// Something to highlight
hbox.getChildren().clear();
while (str.contains(HIGHLIGHT_START)) {
// First part
Label label = new Label(str.substring(0, str.indexOf(HIGHLIGHT_START)));
hbox.getChildren().add(label);
str = str.substring(str.indexOf(HIGHLIGHT_START) + HIGHLIGHT_START.length(), str.length());
// Part to highlight
Label label2 = new Label(str.substring(0, str.indexOf(HIGHLIGHT_END)));
label2.setStyle("-fx-background-color: blue;");
hbox.getChildren().add(label2);
// Last part
str = str.substring(str.indexOf(HIGHLIGHT_END) + HIGHLIGHT_END.length(), str.length());
if (!str.contains(HIGHLIGHT_START)) {
Label label3 = new Label(str);
hbox.getChildren().add(label3);
}
}
} else if (txtSearchField.getText().length() < 1) {
// Remove former highlightings and show simple text
str = str.replaceAll(HIGHLIGHT_START, "");
str = str.replaceAll(HIGHLIGHT_END, "");
hbox.getChildren().clear();
Label label = new Label(str);
hbox.getChildren().add(label);
} else {
// show simple text
hbox.getChildren().clear();
Label label = new Label(str);
hbox.getChildren().add(label);
}
setGraphic(hbox);
}
}
};
return cell;
}
});
유감스럽게도'setPrefWidth'는'Text'에서 사용할 수 없습니다. 사용자가 다른 패턴을 강조 표시하기 때문에 강조 표시된 영역이 변경되기 때문에 각각의 TextFlows를 다시 작성해야합니다. – alex
첫 번째 : Text가 아니라 TextFlow에서 setPrefWidth를 의미했습니다. 둘째 : TextFlow를 저장하고 포함 된 Text 요소 만 다시 작성할 수 있습니다. – eckig
1) anythink를 변경하지 않으면 텍스트가 이전처럼 랩핑됩니다. 2) 예, TextFlow 요소를 유지하기 위해 가능하지만 이후 alls Text children을 삭제하고 새로운 것들을 만들어야하기 때문에 나는이 성능을 향상시키는 것에 대해 의심 스럽습니다. ... – alex