java 不可最小化,java – 这是最小化绑定失效的有效方法吗?
我有一些復(fù)雜的Observable結(jié)構(gòu),這可能是也可能不是壞主意,但這不是這個(gè)問(wèn)題的焦點(diǎn).
這些結(jié)構(gòu)的問(wèn)題在于它們會(huì)產(chǎn)生很多UI顯示的Observable對(duì)象的失效.就像我所知道的那樣,當(dāng)JavaFX UI顯示某些內(nèi)容時(shí),它在其上注冊(cè)了ChangeListener,因此任何使用延遲評(píng)估的嘗試都會(huì)消失.也就是說(shuō),使observable無(wú)效似乎告訴UI它可能已經(jīng)改變,這會(huì)導(dǎo)致UI立即請(qǐng)求它的值,迫使它立即進(jìn)行評(píng)估.
所以,我想通過(guò)Platform.runLater()推遲失效.
我創(chuàng)建了一個(gè)名為DeferredBinding的類(lèi),它將所有內(nèi)容委托給一個(gè)包裝的Binding,但invalidate()方法除外,它將延遲到稍后要處理的JavaFX UI線(xiàn)程.它似乎工作……我可以無(wú)效一百次,它似乎只是實(shí)際處理失效一次.
但是,我之前沒(méi)有見(jiàn)過(guò)這種模式,我擔(dān)心它可能會(huì)屬于“不錯(cuò)但嘗試不好”的范疇.
所以,問(wèn)題:這是一個(gè)壞主意嗎?我特別關(guān)注引入依賴(lài)于DeferredBinding的其他Observable對(duì)象的錯(cuò)誤.一旦Platform.runLater()發(fā)生,它們會(huì)好嗎?
package com.subaru.SAM.model.datastructures;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.binding.Binding;
import javafx.beans.value.ChangeListener;
import javafx.collections.ObservableList;
/**
* Specialized binding that defers its invalidations to the JavaFX UI thread in a throttled manner. The idea being that, if invalidate() is called many times,
* it only basically happens once (when the UI thread gets to it).
*/
public class DeferredBinding implements Binding {
private static final Logger logger = Logger.getLogger(DeferredBinding.class.getName());
private final Binding binding;
private final AtomicBoolean pendingInvalidation = new AtomicBoolean(false);
public DeferredBinding(Binding binding) {
this.binding = binding;
}
@Override
public void addListener(ChangeListener super T> listener) {
binding.addListener(listener);
}
@Override
public void removeListener(ChangeListener super T> listener) {
binding.removeListener(listener);
}
@Override
public T getValue() {
return binding.getValue();
}
@Override
public void addListener(InvalidationListener listener) {
binding.addListener(listener);
}
@Override
public void removeListener(InvalidationListener listener) {
binding.removeListener(listener);
}
@Override
public boolean isValid() {
return binding.isValid();
}
/**
* Override logic for invalidate() method to defer invalidation to runLater. Throttle the invalidations so as not to floor the JavaFX UI thread with
* multiple calls
*/
@Override
public void invalidate() {
if (pendingInvalidation.getAndSet(true) == false) {
Platform.runLater(() -> {
// Signal that the UI is processing the pending invalidation, so any additional invalidations must schedule another update.
pendingInvalidation.set(false);
binding.invalidate();
});
}
}
@Override
public ObservableList> getDependencies() {
return binding.getDependencies();
}
@Override
public void dispose() {
binding.dispose();
}
}
總結(jié)
以上是生活随笔為你收集整理的java 不可最小化,java – 这是最小化绑定失效的有效方法吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php pthread 实例,php 真
- 下一篇: java和内存交互,java内存模型-内