javafx:setRowFactory无法检测TableView的当前状态

时间:2015-09-03 17:13:11

标签: java javafx

我有setRowFactory的以下课程。我不是把它写成匿名类的原因是因为我在这个类中有多个函数,我希望这个类可以重用。功能是:

  1. 在TableView
  2. 中突出显示最近添加的交易对象(整行)
  3. 闪现"价格"当price属性大于0时,单元格,其中caution属性变为true。
  4. 公共类贸易{

        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();
        }
    
    }
    

1 个答案:

答案 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();
}