提问者:小点点

JavaFX:自定义ListView单元格的内容样式


我在我的JavaFX应用程序中使用了自定义ListCellsListView。我设置了根窗格,通过setGrapical方法设置了一个GridPane。现在我想通过CSS设置GridPane内容的样式。假设这个GridPane有my-gridpane类。

.list-cell:selected > .my-gridpane{
  /* CSS sytles */
}

不幸的是,这不起作用。我想这是因为我没有将单元格的内容添加到其子单元格中,所以直接子单元格选择器不起作用。现在我的问题是:是否可以通过CSS设置列表单元格的自定义内容的样式?

提前谢谢


共1个答案

匿名用户

好的。这是一个有同样问题的应用程序。

package listviewstyle;

import java.io.File;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

public class App extends Application {

private ListView<String> list;

@Override
public void start(Stage stage) throws Exception {
    File f=new File("src/listviewstyle/style.css");
    VBox root = new VBox();
    root.setFillWidth(true);
    list = new ListView<>();
    initListView();
    root.getChildren().add(list);
    root.getStylesheets().add(f.toURI().toURL().toString());
    stage.setScene(new Scene(root, 500, 200));
    stage.show();
}

private void initListView() {
    list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> param) {
            return new CellLayout();
        }
    });
    list.getItems().add("string1");
    list.getItems().add("string2");
    list.getItems().add("string3");
    list.getItems().add("string4");
}

private static class CellLayout extends ListCell<String> {
    @Override
    protected void updateItem(String arg, boolean arg1) {
        if (arg != null) {
            Label l1 = new Label(arg);
            GridPane pane = new GridPane();
            pane.add(l1, 0, 0);
            pane.getStyleClass().add("cell-root");
            this.setGraphic(pane);
        } else {
            setGraphic(null);
        }
    }
}

public static void main(String[] args) {
    launch(args);
}
}

这是我的css文件style. css。

.list-cell:selected > .cell-root{
    -fx-background-color: blue;
}

.list-cell:selected{
    -fx-border-width:10px;
    -fx-border-color:pink;
}

.cell-root{
    -fx-background-color: red;
}

谢谢你的帮助。ok解决了问题。我需要调用超类的updateItem方法。