1

たとえば、部分文字列に別の色を与えることで、JavaFX 2 の TableView セル内の部分文字列を強調表示することは可能ですか? はいの場合、これはどのように達成できますか?

アドバイスをいただければ幸いです。

4

2 に答える 2

3

Java7 で考えられる解決策の 1 つ。セルにはセル ファクトリを使用します。工場からTextFieldを返します。TextField をnot editableに設定します。TextField のメソッドを使用して、強調表示するテキストを選択します(これを行うにはPlatform.runLaterメソッドが必要な場合があり、テキストを選択できるようにするためにフィールドにフォーカスする必要がある場合があります)。選択が完了したら (そして実際に表示されたら)、マウス入力を無効にし、TextField の移動にフォーカスして、ユーザーがおそらく Platform.runLater でも選択を変更できないようにします。

Java8 の場合も同様のことができますが、TextField の代わりにTextFlowを使用し、css または Java API を使用してテキスト フロー内のサブテキストのスタイルを設定します。

セルの一部ではなく、セル内のすべてのテキストを強調表示したい場合は、標準のLabelと css スタイルを使用できます。部分的なテキストの強調表示の別の解決策は、内部に複数のラベルがあり、それぞれに異なるスタイルを持つ FlowPane を使用することです。

于 2013-02-20T12:13:47.917 に答える
1

テーブルビュー セルの部分文字列を強調表示する方法はたくさんあります。を使用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 に答える