我对Java相对陌生,尤其是摇摆不定。我使用Netbeans 6.8开发。
我有一个使用自定义AbstractListModel的JList。此AbstractListModel跟踪对数据库中数据的更改,并在将新元素添加到列表时调用fireIntervalAdded。这很完美。
我遇到的问题是我希望JList(或JScrollPane)自动滚动到列表中的新元素。我已经读过我可以使用JList.ensureIndexIsVisible,但是我不知道如何从其关联的ListModel中获得对JList实例的引用(因为我正在从ListModel中触发“ fireIntervalAdded”)。
为了说明一点,我在ListModel中构建了一个轮询器,以轮询来自SQL Server的新数据。由于我将ListModel视为列表的“数据源”,因此有意将数据检索(在我的情况下为轮询)逻辑放入此ListModel中。这些教程似乎并未涵盖从Model本身进行控件滚动的这种特殊需求(之所以有意义,是因为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.");
}
}
最佳答案
就我个人而言,我不会直接从这样的模型尝试更改ui。您最好将另一个侦听器附加到该模型,并引用所讨论的列表,这样可以使解决方案可重用。
我可能很想扩展jlist并使用专门的内部侦听器,但这取决于您的要求