如何以编程方式用户根据 JavaFX 中的字符串值定义列表视图的颜色

Posted

技术标签:

【中文标题】如何以编程方式用户根据 JavaFX 中的字符串值定义列表视图的颜色【英文标题】:How to programmatically user define colors for a list view based on a string value in JavaFX 【发布时间】:2013-07-04 12:13:04 【问题描述】:

如果行中的文本与用户指定的文本匹配,我需要能够突出显示列表框中的一行,即用户说突出显示所有包含“警告”一词的行…… 我四处打听,发现 this Alex 向我展示了如何使用样式表。

我实现了上面的解决方案。但现在我想增强它,以便用户可以选择多个字符串值的前景色和背景色(第一个指定的优先级最高) 我玩过 CSS 并添加了一种样式,并根据是否找到文本,我删除并添加 CSS 样式表以提供如下效果:

highlighter.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的java代码 SearchHighlightedTextCell.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("");

这会产生类似的东西

但问题是我不可能在样式表中定义前景色和背景色的所有组合。 有没有一种方法可以根据用户偏好以编程方式手动添加样式表。 或者还有其他方法可以做到这一点。 这是我为用户设计的屏幕,用于指示应突出显示的内容

【问题讨论】:

【参考方案1】:

据我所知,JavaFX 2.2 目前缺少该功能。到目前为止,在这些情况下,我所做的是以编程方式创建 CSS 文件,将其写入临时文件并在用户选择新首选项时将其添加为样式表。当然,这是一个非常尴尬的解决方法。

另一种可能性,虽然可以说更不干净,但根本不使用具体的 CSS 类,而是直接使用 Node#setStyle(String) 来操作元素的样式。

【讨论】:

【参考方案2】:

您可以在列表视图中使用 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);
                        
                    
                ;
            
        );

【讨论】:

以上是关于如何以编程方式用户根据 JavaFX 中的字符串值定义列表视图的颜色的主要内容,如果未能解决你的问题,请参考以下文章

我如何以编程方式从另一种方法单击 JavaFX 中的按钮?

如何根据用户当前输入以编程方式访问匹配值列表 - jQuery Autocomplete?

JavaFX:以编程方式展开组合框

Android:根据用户设置以编程方式更改 SourceSet

如何以编程方式更改 Android 中的字符串资源 xml 值?

Cocoa 绑定,绑定到文本字段的默认值中的字符串值。如何以编程方式读取此字符串?