我是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.");
}
}
答案 0 :(得分:2)
就个人而言,我不会尝试&直接从这样的模型更改ui。您最好通过对相关列表的引用将另一个侦听器附加到模型,这使得该解决方案可以重用。
我可能想扩展jlist&使用专门的内部监听器,但这取决于您的要求