Javafx: как связать события из observableList - PullRequest
0 голосов
/ 27 марта 2019

Я использую observableList, для которого мне нужно реагировать на изменения самих элементов. Это работает нормально, если только один из Elenemnts в одном из наборов данных изменяется. Но, к сожалению, иногда все изменяются одновременно из-за внешней привязки, и я получаю сотни событий одновременно, но на самом деле было бы достаточно (и эффективно), если бы я мог реагировать только на одно из них и игнорировать другие.

Есть ли какой-либо возможный способ связать такие события или обнаружить, принадлежат ли они одному и тому же набору, и игнорировать другие, как только я обработал первое.

Я был бы очень рад, если бы кто-нибудь мог помочь с решением.

Ниже приведен упрощенный код.

Первый класс данных

package fxtester;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

public class Data {

  private final DoubleProperty number1 = new SimpleDoubleProperty();
  private final DoubleProperty number2 = new SimpleDoubleProperty();

  private BooleanProperty event;


  public Data(BooleanProperty bp) {
      event.bind(bp);

      event.addListener((observable) -> {
          number1.set(number1.get()+1);
          number2.set(number2.get()+1);            
      });
  }

  public DoubleProperty number2Property() {
      return number2;
  }

  public double getNumber1() {
      return number1.get();
  }

  public void setNumber1(double value) {
      number1.set(value);
  }

  public DoubleProperty number1Property() {
      return number1;
  }

  public double getNumber2() {
      return number2.get();
  }

  public void setNumber2(double value) {
      number2.set(value);
  }
}

А вот основная инициализация из наблюдаемого списка

 package fxtester;

 import javafx.beans.Observable;
 import javafx.collections.FXCollections;
 import javafx.collections.ListChangeListener;
 import javafx.collections.ObservableList;

 public class Go {

     private ObservableList<Data> data = 
            FXCollections.observableArrayList(param -> new Observable[]{
                 param.number1Property(), param.number2Property()
            });

     public Go() {
         data.addListener(new ListChangeListener<Data>() {
             @Override
             public void onChanged(javafx.collections.ListChangeListener.Change<? extends Data> c) {
                 System.out.println("Event");
             }
         });
     }

 }
...