2017-02-09 6 views
0

От JavaDoc:ListChangeListener.Change: как правильно обрабатывать обновленные и перестановкой элементы

ObservableList theList = ...; 

theList.addListener(new ListChangeListener<Item>() { 
    public void onChanged(Change<tem> c) { 
     while (c.next()) { 
      if (c.wasPermutated()) { 
        for (int i = c.getFrom(); i < c.getTo(); ++i) { 
          //permutate 
        } 
       } else if (c.wasUpdated()) { 
          //update item 
       } else { 
        for (Item remitem : c.getRemoved()) { 
         remitem.remove(Outer.this); 
        } 
        for (Item additem : c.getAddedSubList()) { 
         additem.add(Outer.this); 
        } 
       } 
      } 
     } 
    }); 
} 

Добавление и удаление элементов прямо вперед, но как насчет //update item и // permutate?

Как узнать, какие элементы были перестановлены другими товарами?

Что именно означает обновление? Это просто добавление одного и того же элемента в список снова?

А что

for (Item remitem : c.getRemoved()) { 
remitem.remove(Outer.this); 
} 
or (Item additem : c.getAddedSubList()) { 
additem.add(Outer.this); 
} 

Что Outer.this значит?

ответ

1

Как узнать, какие элементы были перестановлены, с помощью которых были отправлены другие предметы?

Это изменение имеет метод getPermutation(), который описывает, как элементы были перегруппированы.


Что обновление означает?

Список обновляется, если свойства, принадлежащие элементу, изменяются, хотя одни и те же элементы остаются в списке (в том же порядке). Например, данный класс

public class Item { 

    private final IntegerProperty value = new SimpleIntegerProperty(); 

    public final IntegerProperty valueProperty() { 
     return value ; 
    } 

    public final int getValue() { 
     return valueProperty().get(); 
    } 

    public final void setValue(int value) { 
     valueProperty().set(value); 
    } 

    public Item(int value) { 
     setValue(value); 
    } 
} 

setValue() вызова на элемент списка может сработать обновление. Обратите внимание, что в documentation указано, что обновления являются «необязательными» и не могут быть запущены всеми списками. В частности, для получения списка, что пожары обновления, создайте его с extractor:

ObservableList<Item> list = FXCollections.observableArrayList(
    item -> new Observable[] {item.valueProperty()}); 

list.addAll(new Item(1), new Item(2), new Item(3)); 

list.addListener((Change<? extends Item> c) -> { 
    while (c.next()) { 
     if (c.wasUpdated()) { 
      System.out.println("Items from "+c.getFrom()+" to "+c.getTo()+" changed"); 
     } 
    } 
}); 

list.get(1).setValue(42); 

Последняя строка кода не изменяется, какие элементы в списке, или в каком порядке они находятся, но изменяет свойство одного из элементов. Таким образом, это изменение приведет к обновлению.


Что Outer.this значит?

Это просто ссылка на текущий объект окружающего класса (который предположительно имеет имя класса Outer); то есть не текущий объект анонимной внутренней реализации класса ListChangeListener. См. What is the difference between Class.this and this in Java (и многие другие). Я думаю, что контекст фрагмента кода в документации должен быть классом, который реализует ObservableList и поддерживает свой собственный экземпляр ObservableList (узор декоратора). Он наблюдает за экземпляром списка и сам обновляется, чтобы синхронизировать его.

+0

Большое спасибо за объяснения! Еще один вопрос относительно Outer.this. Должен ли код не быть 'Outer.this.remove (remitem)' и 'Outer.this.add (additem)' intead? – kerner1000

+1

Я предполагаю, что в моей интерпретации код, который вы предлагаете, будет более интуитивным.Возможно, идея состоит в том, что окружающий класс («Наружный») является своего рода слушателем, а код регистрирует/отменяет регистрацию слушателя на элементы, которые добавляются и удаляются. Не совсем точно, что было в документации. –

 Смежные вопросы

  • Нет связанных вопросов^_^