在 JavaFX 的 ListView 中设置项目颜色

O.K*_*Kar 4 java javafx

我有一个ListView包含对象(由名称表示)的 JavaFX 。我想根据其严重性(对象的字段之一)为每个项目的名称着色。是否可以?如果是,我该怎么做?

例如,我在列表视图中有一个世界各地的新闻列表,每个新消息都有一个字段,无论是否是重要的新消息,如果是,我想在列表视图中将新消息的名称涂成红色,否则我想用绿色给它上色。

我的代码:

private ListView<String> newsList;

private Vector<IntelligenceNew> newsListVec;

private ObservableList<String> newsListObserver;

public void initializeListView(IntelligenceSource source) {
    newsListObserver = FXCollections.observableArrayList ();
    newsListVec = new Vector<>();
    for (IntelligenceNew news : source.getListOfNews()){
        newsListObserver.add(news.getName());
        newsListVec.add(news);
    }

    newsList.setItems(newsListObserver);
}
Run Code Online (Sandbox Code Playgroud)

在将新闻插入 ListView 时,我想检查每个新消息的严重性,然后将其着色为红色或绿色。

TT.*_*TT. 6


public class YourFormatCell extends ListCell<String> {
    @Override 
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        setText(item);
        setTextFill(isSevere(item)?Color.RED:Color.GREEN);
    }
}
Run Code Online (Sandbox Code Playgroud)
newsList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
    @Override 
    public ListCell<String> call(ListView<String> list) {
        return new YourFormatCell();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。多亏了你,我节省了几分钟的时间:)添加一个空检查 `if (item != null) setTextFill(isSevere(item)?Color.RED:Color.GREEN);` 也很好,因为有时 item 为空(或在 isSevere 方法中处理) (2认同)