0
다음 코드를 사용하여 Table
의 텍스트를 강조 표시하고 HBoxes
에 복수 Labels
이 포함 된 텍스트를 강조 표시하고 있습니다. 그러나 일부 Labels
은 텍스트 대신 타원을 표시합니다. Labels
을 전폭으로 표시하려면 어떻게해야합니까?JavaFX 테이블 : 레이블이 예상대로 작동하지 않습니다.
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();
hbox.setAlignment(Pos.CENTER_LEFT);
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)));
label.setWrapText(false);
label.setMaxWidth(Double.MAX_VALUE);
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.setWrapText(false);
label2.setMaxWidth(Double.MAX_VALUE);
label2.setStyle("-fx-background-color: "+ HIGHLIGHT_COLOR+";");
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);
label3.setWrapText(false);
label3.setMaxWidth(Double.MAX_VALUE);
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);
label.setWrapText(false);
label.setMaxWidth(Double.MAX_VALUE);
hbox.getChildren().add(label);
} else {
// show simple text
hbox.getChildren().clear();
Label label = new Label(str);
label.setWrapText(false);
label.setMaxWidth(Double.MAX_VALUE);
hbox.getChildren().add(label);
}
setGraphic(hbox);
}
}
};
return cell;
}
});
솔루션
각 TableView
에 대해 서로 다른 배경 색상으로 HBox
에 Labels
을 사용하여 잘 작동합니다. 내 문제는 강조 표시 검색 및 바꾸기 방법의 버그였습니다.
private static Label createNoEllipsisLabel(String pText)
{
Label label = new Label(pText);
double width = computeTextWidth(label.getFont(), pText, 0);
label.setPrefWidth(width);
label.setMinWidth(width);
return label;
}
private static final TextLayout layout = Toolkit.getToolkit().getTextLayoutFactory().createLayout();
private static double computeTextWidth(Font font, String text, double wrappingWidth) {
layout.setContent(text != null ? text : "", font.impl_getNativeFont());
layout.setWrapWidth((float)wrappingWidth);
return layout.getBounds().getWidth();
}
이 com.sun.javafx.scene.control.skin.Utils.computeTextWidth(Font, String, double)
에서 복사되기 때문에 오히려 좋은 생각이 아니다 매우 내부 API를 사용 :
동작이 이상하게 보입니다. 버그입니까, 아니면 원하는 동작입니까? – alex
불행히도 귀하의 솔루션이 나를 위해 작동하지 않습니다, 레이블은 elipsis와 함께있어 ... – alex
나는 TableView 내부에서 그것을 테스트하지 않았고 그것이 어디에 문제라고 생각합니다 : 각 테이블 셀은 크기를 조정할 수 있어야하며 열보다 더 커질 수 없습니다. FlowPane을 사용하는 것이 더 나은 옵션이라고 생각합니다. 라벨이 셀 너비를 초과하면 라벨이 여러 줄로 나뉩니다. 그러나 이것으로 인해 레이블은 필요한 공간을 확보 할 수 있습니다. – eckig