1

我对 Java 比较陌生,尤其是摇摆。我使用 Netbeans 6.8 进行开发。

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

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

稍微解释一下,我在 ListModel 中构建了一个轮询器来轮询来自 SQL 服务器的新数据。由于我将 ListModel 视为列表的“数据源”,因此将数据检索(在我的情况下为轮询)逻辑放入此 ListModel 是有意义的。这些教程似乎没有涵盖从模型本身控制滚动的这种特定需求(这是有道理的,因为 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.");
    }
}
4

1 回答 1

2

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

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

于 2012-07-16T18:10:25.657 回答