更改tableView中的css行javafx

时间:2016-08-03 07:08:28

标签: css javafx

我有一个带有on列的TableView包含一篇文章和另一个有价格的列。当我点击一个按钮时,我想更改索引行的行的css。 我有这个:

articleTable.setRowFactory(param -> new TableRow<LigneTicket>() {
        @Override
        protected void updateItem(LigneTicket paramT, boolean empty) {

            super.updateItem(paramT, empty);
            if (!isEmpty() && paramT != null && paramT.getArticle().isArticleAnnuler()) {
                getStyleClass().add("articleCanceled");
                articleTable.refresh();
            }
        }
    });

但是这段代码可以改变我的tableView,而不仅仅是单击按钮,而且它不能在索引行中选择。

请帮忙,

由于

2 个答案:

答案 0 :(得分:0)

在活动结束后尝试使用一个黑客:

for ( Column col : articleTable.getColumns() ) {
    col.setVisible( false );
    col.setVisible( true );
}

答案 1 :(得分:0)

请注意,表项和表行之间没有1:1的关系。

TableRow仅对可见项存在,可以重新分配值。因此,您需要注意正确删除样式类。

此外,我建议使用伪类,而不是使用样式类来标记行,这样可以更容易地添加/删除。

您可以在项目类本身中存储有关项目状态的数据,或将其存储在合适的外部数据结构中。

以下示例在与removed中的项目关联的值发生更改时,向表行添加/删除ObservableMap伪类。

按钮允许从所选行中分配或清除伪类。

您可以使用索引而不是项目来执行类似的操作。

@Override
public void start(Stage primaryStage) {
    TableView<Item> tableView = new TableView<>(FXCollections.observableArrayList(
            new Item("a"),
            new Item("b"),
            new Item("c"),
            new Item("d"),
            new Item("e"),
            new Item("f")
    ));
    tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    ObservableMap<Item, Boolean> removed = FXCollections.observableHashMap();
    PseudoClass removedPseudoClass = PseudoClass.getPseudoClass("removed");

    tableView.setRowFactory(tv -> {
        TableRow<Item> result = new TableRow<>();

        ObjectBinding<Boolean> binding = Bindings.valueAt(removed, result.itemProperty());
        binding.addListener((observable, oldValue, newValue) -> result.pseudoClassStateChanged(removedPseudoClass, newValue != null && newValue));

        return result;
    });

    TableColumn<Item, String> column = new TableColumn<>("value");
    column.setCellValueFactory(td -> td.getValue().valueProperty());
    tableView.getColumns().add(column);

    Button btn = new Button("remove");
    Button btn2 = new Button("add");

    btn.setOnAction(evt -> {
        for (Item item : tableView.getSelectionModel().getSelectedItems()) {
            removed.put(item, Boolean.TRUE);
        }
    });

    btn2.setOnAction(evt -> {
        for (Item item : tableView.getSelectionModel().getSelectedItems()) {
            removed.remove(item);
        }
    });

    Scene scene = new Scene(new VBox(10, tableView, btn, btn2));
    scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());

    primaryStage.setScene(scene);
    primaryStage.show();
}
public class Item {

    public Item() {
    }

    public Item(String value) {
        this.value.set(value);
    }

    private final StringProperty value = new SimpleStringProperty();

    public String getValue() {
        return value.get();
    }

    public void setValue(String val) {
        value.set(val);
    }

    public StringProperty valueProperty() {
        return value;
    }

}

<强>的style.css

.table-row-cell:filled {
    -fx-background-color: lime;
}

.table-row-cell:filled:selected {
    -fx-background-color: -fx-selection-bar;
}

.table-row-cell:filled:removed {
    -fx-background-color: orange;
}

.table-row-cell:filled:removed:selected {
    -fx-background-color: -fx-selection-bar;
}