javafx:表格行闪烁

时间:2015-08-23 07:57:59

标签: java javafx

我为我创建的每个ReadOnlyBooleanProperty对象都有一个名为caution的{​​{1}}。每个Trade对象填充表视图中的一行。现在,当Tradecaution时,我希望表格行保持橙色闪烁。

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,我怎样才能永久保持表格行闪烁

1 个答案:

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

以及您想要的任何其他风格。