java 不可最小化,java – 这是最小化绑定失效的有效方法吗?
我有一些復雜的Observable結構,這可能是也可能不是壞主意,但這不是這個問題的焦點.
這些結構的問題在于它們會產生很多UI顯示的Observable對象的失效.就像我所知道的那樣,當JavaFX UI顯示某些內容時,它在其上注冊了ChangeListener,因此任何使用延遲評估的嘗試都會消失.也就是說,使observable無效似乎告訴UI它可能已經改變,這會導致UI立即請求它的值,迫使它立即進行評估.
所以,我想通過Platform.runLater()推遲失效.
我創建了一個名為DeferredBinding的類,它將所有內容委托給一個包裝的Binding,但invalidate()方法除外,它將延遲到稍后要處理的JavaFX UI線程.它似乎工作……我可以無效一百次,它似乎只是實際處理失效一次.
但是,我之前沒有見過這種模式,我擔心它可能會屬于“不錯但嘗試不好”的范疇.
所以,問題:這是一個壞主意嗎?我特別關注引入依賴于DeferredBinding的其他Observable對象的錯誤.一旦Platform.runLater()發生,它們會好嗎?
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();
}
}
總結
以上是生活随笔為你收集整理的java 不可最小化,java – 这是最小化绑定失效的有效方法吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php pthread 实例,php 真
- 下一篇: php执行mysql insert,当执