更改TableView Javafx中添加的新行的css

时间:2016-07-05 11:53:15

标签: css javafx tableview

我很抱歉我是法国人。 所以我有一个tableView为空。我有一个按钮"添加"在单击时添加tableView中的行。当我在tableView中选择一行时,一个新按钮"取消"节目。 当我点击一个按钮"取消"时,行的css在我选择的行上发生了变化(添加了一个类css" .cancel")。

问题是我点击按钮"取消",然后点击按钮"添加",css" .cancel"如果我没有点击按钮"添加",则应用于另一行。

我认为索引行存在问题。

在我的方法初始化中:

articleTable.setRowFactory(param -> new TableRow<LigneTicket>() {
        @Override
        protected void updateItem(LigneTicket paramT, boolean empty) {
            super.updateItem(paramT, empty);
            if (!isEmpty() && paramT != null && paramT.getArticle().isArticleCanceled()) {
                getStyleClass().add("cancel");
            }
        }
    });

我的代码在按钮&#34;取消&#34; :

    public void cancelLigneTicket() {
    int indexSelected = articleTable.getSelectionModel().getSelectedIndex();
                     articleTable.getItems().get(indexSelected).getArticle().setArticleAnnuler(true);

articleTable.getSelectionModel().clearSelection();

List<LigneTicket> items = new ArrayList<>(articleTable.getItems());

articleTable.getItems().setAll(items);

buttonAnnulArt.setVisible(false);

帮助!!

感谢。

1 个答案:

答案 0 :(得分:1)

TableRow用于显示表项。但这并不意味着它只与一个项目一起使用。

这可能会导致行r的以下事件序列:

  1. r的项目已更新为已取消的项目,因此会添加cancel CSS类。
  2. r的项目已更新为未取消的项目,但cancel CSS类未被删除。
  3. 您需要再次删除该课程。此外,使用您的代码,可以多次添加样式类,从而导致不必要的内存消耗。

    boolean canceled = !empty && paramT != null && paramT.getArticle().isArticleCanceled());
    if (canceled) {
         if (!getStyleClass().contains("cancel"))
              getStyleClass().add("cancel");
    } else {
         getStyleClass().remove("cancel");
    }
    

    或使用PseudoClass

    private static final PseudoClass CANCELED = PseudoClass.getPseudoClass("cancel");
    
    ...
    pseudoClassStateChanged(CANCELED, !empty && paramT != null && paramT.getArticle().isArticleCanceled());
    

    此外,您应该更喜欢TableView.refresh(在JavaFX&gt; = 8u60中提供)方法来刷新单元格项目,而不是复制列表和设置项目。