最初に私の質問は、新たに追加された行をJavaFxでフラッシュさせる方法です。次に、このトピックに関する多くの質問(例:javafx: table row flashing)を調べました。それらのほとんどはsetRowFactoryとオーバーライド行の疑似クラスの状態を変更するタイムラインアニメーションを追加することによりupdateItem方法を使用しています。 以下は私のコードですが、私は再利用できるFlashControlを構築しようとしています。tableRowが表示されなくてもフラッシュする方法(JavaFx)
public class TableFlashControl<T> {
private PseudoClass flashHighlight = PseudoClass.getPseudoClass("flash-highlight");
private List<T> newAdded = new ArrayList<>();
private boolean isFilterApplied = false;
private boolean isSorted = false;
public void setIsFilterApplied(boolean isFilterApplied) {
this.isFilterApplied = isFilterApplied;
}
public void add(TableView<T> table){
ListChangeListener<T> change = c -> {
while (c.next()) {
if (c.wasAdded()) {
List<? extends T> added = c.getAddedSubList();
T lastAdded = added.get(0);
if (!isFilterApplied) {
newAdded.add(lastAdded);
}
}
}
};
table.getItems().addListener(change);
table.setRowFactory(param -> new TableRow<T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
return;
}
if (newAdded.contains(item)) {
if (isSorted) {
new Thread(()->{
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.4), e -> pseudoClassStateChanged(flashHighlight, true)),
new KeyFrame(Duration.seconds(0.8), e -> pseudoClassStateChanged(flashHighlight, false))
);
flasher.setCycleCount(2);
flasher.play();
}).start();
if (item == newAdded.get(0)) {
newAdded.clear();
isSorted = false;
}
}else{
if(item == newAdded.get(0)){
isSorted = true;
}
}
}
}
});
}
}
ここListChangeListenerは私が新たに挿入された行を記録するのに役立つtable.getItems()に関連付けられています。
複数の行を1回の操作で追加することができます。つまり、newAdded.size()は1より大きい場合があります。 (私はナンバーでそれを並べ替えるため。)しかも、行はのtableViewのトップから挿入されている
のtableViewではなく、すべての行が表示され、updateItem方法はのみ表示される行を更新します。私の問題は、これらの2つの状況が起こったときです(下記参照)。最初のシナリオで
最初のシナリオ
、唯一の4行は、ユーザが1つの時間内に5行を挿入した場合、私が最後の行の更新(updateItemウォンを記録することができず、表示されていますnew_row_5)を呼び出す必要があります。これにより、私はクリアできないが、第2のシナリオでは
第2のシナリオ
(newAdded.clear()を行うことによって)リストをnewAdded、唯一の4行が再び表示されています。しかし、見える行の上と下の両方に目に見えない行があります。ユーザーが2行を挿入すると、が表示され、もう1つが非表示になります。私の場合、new_row_2が点滅し、new_row_1は見えなくなります。 new_row_2が点滅しているときのtableViewアップユーザーがスクロールは、彼がnew_row_1ながらnew_row_2あるはを点滅表示されます場合は本当に奇妙であるではありません。
また、表示可能な行の数を見つける方法があるかどうかを知りたい場合もあります。
私はまだJavaFxが新しく、この方法が良いかどうかわかりません。私は誰かが私の問題を解決するのを助けることを願っていますどうもありがとう!
わずかにOTですが、なぜ「タイムライン」をスレッドにラッピングしていますか?新しいスレッドは単にタイムラインを開始し、ただちに終了します。 FXアプリケーションスレッドでこれを完全に実行することができます。 –
@James_D申し訳ありませんが、それは私のせいでした...私は新しいスレッドを削除する必要があります.. – ZanderXu