我有setRowFactory
的以下课程。我不是把它写成匿名类的原因是因为我在这个类中有多个函数,我希望这个类可以重用。功能是:
公共类贸易{
private ReadOnlyBooleanWrapper caution;
...
// with constructor there is
public Trade(){
...
this.caution = new ReadOnlyBooleanWrapper();
this.caution.bind(this.price.greaterThan(0));
}
...
}
这很好用。当我删除从TableView交易对象时,出现问题。空行继续闪烁,这显然意味着代码不监视TableView的当前状态。
我还是javafx的新手,我想我错过了addListener
代码来跟踪tableView中所有行的当前状态(如果我错了就纠正我。)我不知道如何写出来。
代码:
public class AnimatedTransactionLogTableRow<T> extends TableRow<T> {
private static final PseudoClass PS_NEW = PseudoClass.getPseudoClass("new-row");
private static final PseudoClass PS_FLASH = PseudoClass.getPseudoClass("flash-row");
private static final PseudoClass PS_CF = PseudoClass.getPseudoClass("cell-positive");
private final ObjectExpression<T> recentItem;
private final InvalidationListener recentlyAddedListener = fObs -> recentItemChanged();
private final Function<T, BooleanExpression> flashExtractor;
private final ChangeListener<Boolean> flashListener = (fObs, fOld, fNew) -> flasherChanged(fNew);
private final Timeline flashTimeline;
public AnimatedTransactionLogTableRow(ObjectExpression<T> fRecentlyAddedProperty
,Function<T, BooleanExpression> fFlashExtractor
) {
recentItem = fRecentlyAddedProperty;
recentItem.addListener(new WeakInvalidationListener(recentlyAddedListener));
flashExtractor = fFlashExtractor;
flashTimeline = new Timeline(
new KeyFrame(Duration.seconds(0.5), e -> pseudoClassStateChanged(PS_FLASH, true)),
new KeyFrame(Duration.seconds(1.0), e -> pseudoClassStateChanged(PS_FLASH, false)));
flashTimeline.setCycleCount(Animation.INDEFINITE);
}
private void flasherChanged(boolean fNew) {
if (fNew) {
flashTimeline.play();
pseudoClassStateChanged(PS_CF,true);
} else {
flashTimeline.stop();
pseudoClassStateChanged(PS_FLASH, false);
pseudoClassStateChanged(PS_CF,false);
}
}
private void recentItemChanged() {
final T tmpRecentItem = recentItem.get();
pseudoClassStateChanged(PS_NEW, tmpRecentItem != null && tmpRecentItem == getItem());
}
@Override
protected void updateItem(T item, boolean empty) {
System.out.println("getItem(): " + getItem());
if (getItem() != null) {
final BooleanExpression be = flashExtractor.apply(getItem());
if (be != null) {
be.removeListener(flashListener);
}
}
super.updateItem(item, empty);
if (getItem() != null) {
final BooleanExpression be = flashExtractor.apply(getItem());
if (be != null) {
be.addListener(flashListener);
flasherChanged(be.get());
}
}
recentItemChanged();
}
}
答案 0 :(得分:1)
如果flasherChanged(false);
为空,我猜您需要致电TableRow
。
例如:
@Override
protected void updateItem(T item, boolean empty) {
System.out.println("getItem(): " + getItem());
if (getItem() != null) {
final BooleanExpression be = flashExtractor.apply(getItem());
if (be != null) {
be.removeListener(flashListener);
}
}
super.updateItem(item, empty);
if(empty) {
flasherChanged(false);
}
else if (getItem() != null) {
final BooleanExpression be = flashExtractor.apply(getItem());
if (be != null) {
be.addListener(flashListener);
flasherChanged(be.get());
}
}
recentItemChanged();
}