2014-04-01 26 views
1

我寫了基於TableCell的TableCell實現。我使用ChangeListener,但它不是垃圾收集。在這種情況下如何使用WeakChangeListener。請參閱我的代碼。如何將它切換到WeakChangeListener。如何在JavaFx中使用WeakChangeListener?

changeListener = new ChangeListener<Object[]>() { 

     @Override 
     public void changed(ObservableValue<? extends Object[]> observable, Object[] oldValue, Object[] newValue) { 
      if (newValue != null && oldValue != null) { 
       if (oldValue[21].equals(newValue[21])) { 
        if (newValue[updateBasedValues] != null) { 
         if (!newValue[updateBasedValues].equals(oldValue[updateBasedValues])) { 
          justUpdated = true; 
         } 
        } 
       } 
      } 
     } 

    };   
    itemProperty().addListener(changeListener); 
+0

公衆面對這兩個對象的API似乎幾乎是相同的。你確定一個簡單的查找和替換是不夠的嗎? –

+0

你是什麼意思查找和替換,我試圖刪除監聽器在最終功能,它不適合我嗎? :/ – kingkong

回答

1

您需要保留對弱偵聽程序的引用,以免過早收集垃圾。 在oracle論壇上閱讀這個非常好的討論:https://community.oracle.com/thread/2396063

我寫了一個可以使用或擴展的適配器類「WeakAdapter」。 示例如何你這個類: 而是寫作的

myBooleanProperty.addListener(new ChangeListener<Boolean>() {...}); 

使用:

weak = new WeakAdapter(); 
weak.addChangeListener(myBooleanProperty, new ChangeListener<Boolean>(){}); 

這裏是類WeakAdapter的代碼: 公共類WeakAdapter {

ArrayList<Object> listenerRefs = new ArrayList<>(); 

    public WeakAdapter() { 
    } 

    public void dipose() { 
     listenerRefs.clear(); 
    } 

    public final <T> void remove(ChangeListener<T> listener) { 
     listenerRefs.remove(listener); 
    } 

    public final <T> void addChangeListener(final ObservableValue observable, ChangeListener<T> listener) { 
     listenerRefs.add(listener); 
     observable.addListener(new WeakChangeListener<>(listener)); 
    } 

    public final <T> WeakListChangeListener<T> addListChangeListener(ListChangeListener<T> listener) { 
     listenerRefs.add(listener); 
     return new WeakListChangeListener<>(listener); 
    } 

    public void addInvalidationListener(final Observable listened, InvalidationListener listener) { 
     listenerRefs.add(listener); 
     listened.addListener(new WeakInvalidationListener(listener)); 
    } 

    public final void stringBind(final StringProperty propertyToUpdate, final StringExpression expressionToListen) { 
     ChangeListener<String> listener = new ChangeListener<String>() { 
      @Override 
      public void changed(ObservableValue<? extends String> ov, String t, String name) { 
       propertyToUpdate.set(name); 
      } 
     }; 
     listenerRefs.add(listener); 
     expressionToListen.addListener(new WeakChangeListener<>(listener)); 
     listener.changed(null, null, expressionToListen.get()); 
    } 

    public final void booleanBind(final BooleanProperty propertyToUpdate, final BooleanExpression expressionToListen) { 
     ChangeListener<Boolean> listener = new ChangeListener<Boolean>() { 
      @Override 
      public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean name) { 
       propertyToUpdate.set(name); 
      } 
     }; 
     listenerRefs.add(listener); 
     expressionToListen.addListener(new WeakChangeListener<>(listener)); 
     propertyToUpdate.set(expressionToListen.get()); 
    } 
}