我的JavaFX应用程序中有一个TableView。 我想在双击行时为其设置不同的样式,并在单击时为其设置不同的样式。
这是我实现的目标:
final PseudoClass doubleClickPseudoClass = PseudoClass.getPseudoClass("new");
setRowFactory(tableView -> {
final TableRow<Bean> row = new TableRow<Bean>();
row.setOnMouseClicked(event -> {
if (event.getClickCount() == 2 && (! row.isEmpty())) {
row.pseudoClassStateChanged(doubleClickPseudoClass, true);
});
return row;
});
但是,当用户双击每个新行时,我希望对所有以前双击的行进行样式设置而无需应用“ new”类: row.pseudoClassStateChanged(doubleClickPseudoClass,false);
我该怎么做? 现在,我已经为双击的所有行设置了样式。
答案 0 :(得分:2)
您不应使用TableRow
来自己存储状态,因为可能会将新项目分配给TableRow
实例。而是使用属性来存储双击项,然后使用侦听器对行进行样式设置:
final ObjectProperty<Bean> doubleClickedObject = new SimpleObjectProperty<>();
setRowFactory(tableView -> new TableRow<Bean>() {
private void updateStyle() {
pseudoClassStateChanged(doubleClickPseudoClass, !isEmpty() && doubleClickedObject.get() == getItem());
}
private final InvalidationListener listener;
{
listener = o -> updateStyle();
doubleClickedObject.addListener(new WeakInvalidationListener(listener));
setOnMouseClicked(event -> {
if (!isEmpty() && event.getClickCount() == 2) {
doubleClickedObject.set(getItem());
}
});
}
@Override
protected void updateItem(Bean item, boolean empty) {
super.updateItem(item, empty);
updateStyle();
}
});