我为我创建的每个ReadOnlyBooleanProperty
对象都有一个名为caution
的{{1}}。每个Trade
对象填充表视图中的一行。现在,当Trade
为caution
时,我希望表格行保持橙色闪烁。
true
只要public class Trade{
private DoubleProperty volume;
private ReadOnlyBooleanWrapper caution;
public Trade(double volume){
this.volume = new SimpleDoubleProperty(volume);
this.caution = new ReadOnlyBooleanWrapper();
this.caution.bind(this.volume.greaterThan(0));
}
}
属性为true,我怎样才能永久保持表格行闪烁?
答案 0 :(得分:2)
要制作闪光灯,请使用Timeline
:
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.5), e -> {
// use "flash" color
}),
new KeyFrame(Duration.seconds(1.0), e -> {
// revert to regular color
})
);
在这种情况下更改颜色的最佳方法是使用CSS PseudoClass
:
PseudoClass flashHighlight = PseudoClass.getPseudoClass("flash-highlight");
Node flashingNode = ... ;
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.5), e -> {
flashingNode.pseudoClassStateChanged(flashHighlight, true);
}),
new KeyFrame(Duration.seconds(1.0), e -> {
flashingNode.pseudoClassStateChanged(flashHighlight, false);
})
);
flasher.setCycleCount(Animation.INDEFINITE);
然后在外部CSS文件中,您可以配置闪光突出显示的样式:
.node-type:flash-highlight {
/* style for flash "on" */
}
要将此绑定到布尔属性,只需使用属性:
创建一个侦听器someBooleanProperty.addListener((obs, oldValue, newValue) -> {
if (newValue) {
flasher.play();
} else {
flasher.stop();
flashingNode.pseudoClassStateChanged(false);
}
});
要将此应用于表格行,您必须编写rowFactory
。您只需要知道行中显示的项目可能会在行的生命周期内发生更改,因此您需要相应地更新状态和侦听器:
TableView<Trade> table = ... ;
PseudoClass flashHighlight = PseudoClass.getPseudoClass("flash-highlight");
table.setRowFactory(tv -> {
TableRow<Trade> row = new TableRow<>();
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.5), e -> {
row.pseudoClassStateChanged(flashHighlight, true);
}),
new KeyFrame(Duration.seconds(1.0), e -> {
row.pseudoClassStateChanged(flashHighlight, false);
})
);
flasher.setCycleCount(Animation.INDEFINITE);
ChangeListener<Boolean> cautionListener = (obs, cautionWasSet, cautionIsNowSet) -> {
if (cautionIsNowSet) {
flasher.play();
} else {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
}
};
row.itemProperty().addListener((obs, oldItem, newItem) -> {
if (oldItem != null) {
oldItem.cautionProperty().removeListener(cautionListener);
}
if (newItem == null) {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
} else {
newItem.cautionProperty().addListener(cautionListener);
if (newItem.cautionProperty().get()) {
flasher.play();
} else {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
}
}
});
return row ;
});
然后只需使用类似
的内容定义外部CSS文件.table-row-cell:flash-highlight {
-fx-background: orange ;
}
以及您想要的任何其他风格。