【问题标题】:java jlist - AbstractListModel - fireContentsChanged does not work properlyjava jlist - AbstractListModel - fireContentsChanged 无法正常工作
【发布时间】:2013-04-29 13:46:57
【问题描述】:

我有一个简单的ListModel,它是可过滤的,用于JList...

它使用以下代码...

public class FilteredListModel extends AbstractListModel
{
private List<LineData> data = null;
private final ArrayList<Integer> indices = new ArrayList<Integer>();

public FilteredListModel()
{
}

public void setData(List<LineData> data)
{
    this.data = data;
    doFilter();
}

public void doFilter()
{
    int oldSize = indices.size();
    indices.clear();

    if (data != null)
    {
        int count = data.size();
        for (int i = 0; i < count; i++)
        {
            IFiltererListObject element = (IFiltererListObject) data.get(i);
            if (element.isVisible())
                indices.add(i);
        }
    }
    fireContentsChanged(this, 0, getSize() - 1);
    if (oldSize > getSize())
        fireIntervalRemoved(this, getSize(), oldSize - 1);
}

@Override
public int getSize()
{
    return indices.size();
}

@Override
public Object getElementAt(int index)
{
    return data.get(indices.get(index));
}

@Override
public void addListDataListener(ListDataListener l)
{
    // TODO Auto-generated method stub
    //doFilter();
}

@Override
public void removeListDataListener(ListDataListener l)
{
    // TODO Auto-generated method stub
    //doFilter();
}
}

奇怪的是,它无法正常工作,例如,如果我在窗口外单击,JListListModel 会正确更新...

我在这里错过了什么?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 实际上,我同时编辑了我的帖子并添加了整个班级......我所做的只是在更新数据后调用 doFilters......但到目前为止还没有工作......
  • "add the whole class" 一个 SSCCE 可能包含多个类,而您的代码原样不是 SSCCE。 别误会,它足够短,但请看剩下的术语..

标签: java swing jlist updating


【解决方案1】:

问题是addListDataListenerremoveListDataListener 方法是空的。这意味着JList 不能再将其侦听器附加到模型。调用 fireContentsChanged 不会做任何事情,因为超类不知道任何侦听器。

不要覆盖这些方法,或者确保您也调用super.addListDataListener

【讨论】:

  • 对不起,你能不能具体一点,否则.......嗯,我会使用 JTable,一列,没有 JTableHeader,而不是打扰瓶中的风
  • @mKorbel 你说的更具体是什么意思。他不应该从AbstractListModel 覆盖这些方法,或者至少在覆盖这些方法时调用super 方法。现在不能将监听器添加到模型中
  • 从来没有见过好的 AbstractListModel,有很多小的不便,造成了一些麻烦......,在这里查看我删除的帖子
  • 实际上,我意识到这些方法导致了问题...并将我的课程更改为扩展 DefaultListModel 并且一切正常...不过谢谢
【解决方案2】:

@Robin 请 DYM???

import java.util.ArrayList;
import javax.swing.AbstractListModel;
import javax.swing.MutableComboBoxModel;

//usage == new JComboBox(new SectionComboBoxModel(new ArrayList());
public class SectionComboBoxModel extends AbstractListModel implements MutableComboBoxModel {

    private static final long serialVersionUID = 1L;
    private Object selectedItem;
    private ArrayList<Object> sections;

    public SectionComboBoxModel(ArrayList<Object> arrayList) {
        sections = arrayList;
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }

    @Override
    public void setSelectedItem(Object newValue) {
        selectedItem = newValue;
    }

    @Override
    public int getSize() {
        return sections.size();
    }

    @Override
    public Object getElementAt(int i) {
        return sections.get(i);
    }

    public void setElementAt(Object newValue, int i) {
        this.fireContentsChanged(newValue, i, i);
        this.sections.set(i, newValue);
    }

    @Override
    public void addElement(Object obj) {
        sections.add(obj);
        this.fireIntervalAdded(obj, this.getSize() - 1, this.getSize() - 1);
    }

    @Override
    public void removeElement(Object obj) {
        this.fireIntervalRemoved(obj, sections.indexOf(obj), sections.indexOf(obj));
        sections.remove(obj);
    }

    @Override
    public void insertElementAt(Object obj, int index) {
        sections.add(index, obj);
        this.fireIntervalAdded(obj, index, index);
    }

    @Override
    public void removeElementAt(int index) {
        this.fireIntervalRemoved(sections.get(index), index, index);
        sections.remove(index);

    }

    public void print() {
        System.out.println("\nPrinting List");
        for (int i = 0; i < this.sections.size(); i++) {
            System.out.println(this.sections.get(i));
        }
    }

    public boolean contains(Object o) {
        return sections.contains(o);
    }

    public Object[] toArray() {
        return this.sections.toArray();
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2017-03-30
    • 2015-02-20
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多