3

行内のテキストがユーザーが指定したテキストと一致する場合、リストボックス内の行を強調表示する機能が必要です。ユーザーは、「警告」という単語を含むすべての行を強調表示すると言います...ここで Alex がスタイル シートの使い方を教えてくれました。

上記のソリューションを実装しました。しかし今、ユーザーが複数の文字列値(最初に指定されたものが最も優先度が高い)の前景色と背景色を選択できるように、それを強化したいと思います。私はCSSをいじって、もう1つのスタイルを追加しましたテキストが見つかったかどうかに基づいて、CSS スタイル シートを削除して追加し、以下のような効果を与えます。

ハイライター.css

/** Highlighting for list-view search result cells */

.list-cell.search-highlight {
-fx-background-color: tomato;
-fx-accent: firebrick;
}

.list-cell:filled:hover.search-highlight {
-fx-background-color: derive(tomato, -20%);
}

.list-cell.search-highlight2 {
-fx-background-color: yellow;
-fx-accent: firebrick;
}

.list-cell:filled:hover.search-highlight2 {
-fx-background-color: derive(yellow, -20%);
}

css SearchHighlightedTextCell.java を削除/追加する Java コード

public class SearchHighlightedTextCell extends ListCell<String> {

private static final String HIGHLIGHT_CLASS = "search-highlight";
private static final String HIGHLIGHT_CLASS2 = "search-highlight2";
private StringProperty searchText = new SimpleStringProperty("");
private StringProperty searchText2 =  new SimpleStringProperty("");

SearchHighlightedTextCell(StringProperty searchText, StringProperty searchText2) {
    this.searchText = searchText;
    this.searchText2 = searchText2;
}

@Override
protected void updateItem(String text, boolean empty) {
    super.updateItem(text, empty);

    setText(text == null ? "" : text);

    updateStyleClass();
    searchText.addListener(new InvalidationListener() {
        @Override
        public void invalidated(Observable observable) {
            updateStyleClass();
        }
    });

    searchText2.addListener(new InvalidationListener() {
        @Override
        public void invalidated(Observable observable) {
            updateStyleClass();
        }
    });
}

private void updateStyleClass() {
    try {
        if (!isEmptyString(searchText.get()) && !isEmptyString(getText()) && getText().toUpperCase().contains(searchText.get().toUpperCase())) {           
            getStyleClass().remove(HIGHLIGHT_CLASS2);
            getStyleClass().add(HIGHLIGHT_CLASS);

        } else if (!isEmptyString(searchText2.get()) && !isEmptyString(getText()) && getText().toUpperCase().contains(searchText2.get().toUpperCase())) {
            getStyleClass().remove(HIGHLIGHT_CLASS);
            getStyleClass().add(HIGHLIGHT_CLASS2);            

        } else {
            getStyleClass().remove(HIGHLIGHT_CLASS2);
            getStyleClass().remove(HIGHLIGHT_CLASS);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }             
}

private boolean isEmptyString(String text) {
    return text == null || text.equals("");
}

これは、このようなものを生成します

Lorem という言葉は赤に、sem は黄色に使用されました。

しかし、問題は、スタイル シートで前景色と背景色のすべての組み合わせを定義することはおそらくできないということです。ユーザーの好みに基づいて、スタイル シートをプログラムで手動で追加する方法はありますか。または、それを行う別の方法があります。これは、ユーザーが何を強調表示する必要があるかを示すために設計した画面です

ここに画像の説明を入力

4

2 に答える 2

4

リストビューで cellfactory を使用すると、簡単に実行できます

listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
            @Override
            public ListCell<String> call(ListView<String> stringListView) {
                return new ListCell<String>(){
                    @Override
                    protected void updateItem(String s, boolean b) {
                        super.updateItem(s, b);    //To change body of overridden methods use File | Settings | File Templates.
                        if (b) {
                            setText(null);
                            setGraphic(null);
                        }
                        if (s.contains("warning")){
                            setStyle(your style here);
                                    setGraphic(your graphics);
                            setText(your text);
                        }
                        if (s.contains("error")){
                            setStyle(your style here);
                            setGraphic(your graphics);
                            setText(your text);
                        }
                    }
                };
            }
        });
于 2013-07-07T09:37:46.160 に答える
1

私の知る限り、その機能は現在 JavaFX 2.2 にはありません。これらのケースでこれまで行ってきたことは、CSS ファイルをプログラムで作成し、それを一時ファイルに書き込んで、ユーザーが新しい設定を選択したときにスタイル シートとして追加することでした。もちろん、これは非常に厄介な回避策です。

もう 1 つの可能性は、間違いなくさらにクリーンではありませんが、具体的な CSS クラスをまったく使用せず、 を使用して要素のスタイルを直接操作することNode#setStyle(String)です。

于 2013-07-07T08:37:49.440 に答える