JList AbstractListModel - fireIntervalAdded& AutoScroll到新元素

时间:2012-07-16 17:36:39

标签: java swing jlist

我是Java的新手,尤其是摇摆。我用Netbeans 6.8开发。

我有一个使用自定义AbstractListModel的JList。此AbstractListModel跟踪数据库中数据的更改,并在将新元素添加到列表时调用fireIntervalAdded。这非常有效。

我遇到的问题是我希望JList(或JScrollPane)自动滚动到列表中的新元素。我已经读过我可以使用JList.ensureIndexIsVisible,但我不知道如何从其关联的ListModel获取对JList实例的引用(因为我从ListModel中触发'fireIntervalAdded')。

为了解释一下,我在ListModel中构建了一个轮询器来从SQL服务器轮询新数据。由于我将ListModel视为列表的“数据源”,因此它使得数据在此ListModel中进行了retreival(并在我的情况下轮询)逻辑。这些教程似乎没有涵盖从模型本身控制滚动的特定需求(由于ListModel可以同时在多个JList中使用,因此排序很有意义......)

我可以做些什么来使JList滚动到ListModel代码中最后创建的元素?

另外,我想我可以解决我的问题,如果我能在JList中找到一个在添加新元素时会触发的事件,但我找不到了!

由于

- 编辑 -

好的,根据MadProgrammer的回复,这是我建立的:

public class JListDataListener implements ListDataListener {
    JList _listToControl = null;
    public JListDataListener(JList listToControl) {
        this._listToControl = listToControl;
        this._listToControl.getModel().addListDataListener(this);
    }

    public void intervalAdded(final ListDataEvent e) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                _listToControl.ensureIndexIsVisible(e.getIndex1() + 1);
                            }
                        });
    }

    public void intervalRemoved(ListDataEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void contentsChanged(ListDataEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}

1 个答案:

答案 0 :(得分:2)

就个人而言,我不会尝试&直接从这样的模型更改ui。您最好通过对相关列表的引用将另一个侦听器附加到模型,这使得该解决方案可以重用。

我可能想扩展jlist&使用专门的内部监听器,但这取决于您的要求