JavaFX表:标签表现不尽如人意

时间:2014-11-18 10:04:41

标签: javafx label

我使用以下代码突出显示Table中包含多个HBoxes Labels的文字。但是一些Labels显示省略号而不是文本。如何强制Labels以全宽显示?

    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;
        }
    });

enter image description here

解决方案
在每个Labels使用不同背景颜色的HBox中使用TableView可以正常工作。我的问题是我突出显示搜索和替换方法中的错误。

1 个答案:

答案 0 :(得分:1)

我只找到了一个相当难看的解决方案:

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,这不是一个好主意。

也许其他人找到了更好的解决方案?