我很抱歉我是法国人。 所以我有一个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);
帮助!!
感谢。
答案 0 :(得分:1)
TableRow
用于显示表项。但这并不意味着它只与一个项目一起使用。
这可能会导致行r
的以下事件序列:
r
的项目已更新为已取消的项目,因此会添加cancel
CSS类。r
的项目已更新为未取消的项目,但cancel
CSS类未被删除。您需要再次删除该课程。此外,使用您的代码,可以多次添加样式类,从而导致不必要的内存消耗。
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中提供)方法来刷新单元格项目,而不是复制列表和设置项目。