3

如果行中的文本与用户指定的文本匹配,我需要能够突出显示列表框中的一行,即用户说突出显示所有包含“警告”一词的行……我四处询问并遇到在这里,Alex 向我展示了如何使用样式表。

我实现了上面的解决方案。但是现在我想增强它,以便用户可以选择为多个字符串值选择前景色和背景色(第一个指定的优先级最高)我已经玩过 CSS 并添加了更多样式和根据是否找到文本,我删除并添加 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 文件,将其写入临时文件并在用户选择新首选项时将其添加为样式表。当然,这是一个非常尴尬的解决方法。

另一种可能性,虽然可以说更不干净,但根本不使用具体的 CSS 类,而是直接使用Node#setStyle(String).

于 2013-07-07T08:37:49.440 回答