1

例如,是否可以通过为子字符串提供另一种颜色来突出显示 JavaFX 2 中 TableView 单元格内的子字符串?如果是,这如何实现?

很高兴有任何建议!

4

2 回答 2

3

Java7 的一种可能的解决方案。为您的细胞使用细胞工厂。从工厂返回一个TextField。将 TextField 设置为不可编辑。使用 TextField 的方法选择要突出显示的文本(可能需要Platform.runLater方法来执行此操作,并且可能需要聚焦该字段以允许选择文本)。一旦选择完成(并真正显示),禁用鼠标输入和TextField 上的焦点遍历,以便用户无法更改选择,也可能在 Platform.runLater 中。

对于 Java8,您可以执行类似的操作,但不要使用 TextField,而是使用TextFlow并使用 css 或 Java API 设置文本流中的子文本样式。

如果您只想突出显示单元格中的所有文本,而不是其中的一部分,那么您可以使用标准的Label和 css 样式。部分文本突出显示的另一种解决方案是使用 FlowPane,其中包含多个标签,每个标签都有不同的样式。

于 2013-02-20T12:13:47.917 回答
1

有很多方法可以突出显示 tableview 单元格的子字符串。我用过HBoxlabel而且看起来不错。

这是我的代码:

public Callback<TableColumn<Address, String>, TableCell<Address, String>> getCellFactory() {
        return new Callback<TableColumn<Address, String>, TableCell<Address, String>>() {
            @Override
            public TableCell<Address, String> call( final TableColumn<Address, String> param ) {
                final TableCell<Address, String> cell = new TableCell<Address, String>() {
                    @Override
                    protected void updateItem( final String value, final boolean empty ) {
                        setGraphic( null );
                        if( null != getTableRow() && !empty ) {
                            final HBox hbox = new HBox();
                            hbox.setAlignment( Pos.CENTER_LEFT );
                            hbox.getChildren().clear();
                            if( null == value ) {
                                return;
                            }

                        final int index = value.toLowerCase().indexOf(str);

                        if( -1 == index ) {
                            //no match
                            hbox.getChildren().add( new Label( value ) );
                        } else {
                            //part of string before match
                            hbox.getChildren().add( new Label( value.substring( 0, index ) ) );
                            //matched part
                            final Label label = new Label( value.substring( index, index + str.length() ) );
                            label.setStyle( "-fx-background-color: #FFFFBF;-fx-text-fill: #FF0000;" );
                            hbox.getChildren().add( label );
                            //part of string after match
                            final int lastPartIndex = index + str.length();
                            if( lastPartIndex < value.length() ) {
                                hbox.getChildren().add( new Label( value.substring( lastPartIndex ) ) );
                            }
                        }
                        setGraphic( hbox );
                    }
                }
            };
            return cell;
        }
    };
}
于 2015-09-27T01:31:46.107 回答