【问题标题】:Java Binding of sublists to main list子列表到主列表的 Java 绑定
【发布时间】:2017-01-19 10:35:57
【问题描述】:

是否有一些板载方法可以将多个子列表绑定到一个主列表?

我已经扩展TreeItem 喜欢:

import java.util.List;
import javafx.scene.control.TreeItem;
import javafx.collections.ObservableList;
// Further imports

public class MyTreeItem extends TreeItem<MyItem>  {
// ...

    public ObservableList<MyHistoryItem>  getOwnHistory() {
          // some code generating data
        }



    public ObservableList<MyHistoryItem>  getCombinedHistory(){
        ObservableList<MLDFXHistoryItem> fxCombHistory = FXCollections.observableArrayList();

        fxCombHistory.addAll(this.getOwnHistory());

        for (TreeItem<MyItem> child: this.getChildren())
        {
            fxCombHistory.addAll(((MyItem) child).getCombinedHistory());
        }

        return fxCombHistory;
    }
 }

函数getCombinedHistory() 将来自根项的数据与其所有子项结合起来。基本上它有效。无论如何,子列表中的更改不会自动转发。

我是否必须编写适当的侦听器来自行更新fxCombHistory,或者有更简单的方法来绑定此列表?

【问题讨论】:

  • 你试过Bindings.bindContentBidirectional(ObservableList&lt;E&gt; list1, ObservableList&lt;E&gt; list2)吗?

标签: java list javafx data-binding


【解决方案1】:

由于我找不到执行此操作的板载方法,因此我编写了我想要分享的 onw 课程。主要接口有removeSublist(int i)addSublist(ObservableList&lt;E&gt; list)。不允许直接add()remove() 的数据,会导致数据不一致。

欢迎反馈实施。 (可以加强对错误输入的处理。)

import java.util.ArrayList;
import java.util.List;
import javafx.collections.ModifiableObservableListBase;
import javafx.collections.ObservableList;
import javafx.collections.ListChangeListener;


public class ObservableCombindedList<E>  extends ModifiableObservableListBase<E> {
    private List<E> mainList = new ArrayList<E>();
    private List<ObservableList<E>> subLists = new ArrayList<>();
    private List<SubListListener> listeners = new ArrayList<>();


    private class SubListListener implements ListChangeListener<E>{

        public SubListListener (){
        }

        @Override
        public  void onChanged(ListChangeListener.Change<? extends E> c) {

            ObservableList<E> subList = (ObservableList<E>) c.getList();

            int subListPos = ObservableCombindedList.this.subLists.indexOf(subList);
            int idxstart = getStartIndex(subListPos);


            while (c.next()) {
                 if (c.wasPermutated() || c.wasUpdated()) {
                     for (int i = c.getFrom(); i < c.getTo(); ++i) {
                             ObservableCombindedList.this.set(i+idxstart,(E) subList.get(i));
                         }
                     }
                 if (c.wasRemoved()) {
                     ObservableCombindedList.this.remove(c.getFrom(),c.getTo());
                  }

                 if (c.wasAdded()){
                         for (int i = c.getFrom(); i < c.getTo(); ++i) {
                             ObservableCombindedList.this.add(i+idxstart,(E) subList.get(i));
                         }
                     }

                 };
        } //  void onChanged

    }  // private class SubListListener implements ListChangeListener<E>

    public  int getStartIndex(int listNr)
    {
        int index = 0;
        for (int i_list  = 0; i_list < listNr ; ++i_list)
        {
            index += this.subLists.get(i_list).size();
        }
        return index;
    }

    public void addSublist(ObservableList<E> list){
        SubListListener listener = new SubListListener();
        this.subLists.add(list);
        list.addListener(listener);

        this.listeners.add(listener);


        for (E el : list)
        {
            this.add(el);
        }
    } // public void addSublist

    public void removeSublist(int i){

        int i_start = getStartIndex(i);

        this.remove(i_start, i_start + this.subLists.get(i).size());

        ObservableList<E> sublist = this.subLists.remove(i);
        ObservableCombindedList<E>.SubListListener listener = this.listeners.remove(i);
        sublist.removeListener(listener);

    }

    @Override
       public E get(int index) {
           return this.mainList.get(index);
       }

    @Override
       public int size() {
           return this.mainList.size();
       }

    @Override
    protected void doAdd(int index, E element) {
        this.mainList.add(index, element);
       }

    @Override
    protected E doSet(int index, E element) {

       return this.mainList.set(index, element);
       }

    @Override
    protected E doRemove(int index) {
          return this.mainList.remove(index);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2011-03-08
    • 2018-04-20
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多