2012-07-16 118 views
1

我相对较新的Java,尤其是摆动。我使用Netbeans 6.8进行开发。JList AbstractListModel - fireIntervalAdded&AutoScroll添加到新元素

我有一个使用自定义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."); 
    } 
} 
+0

见http://stackoverflow.com/questions/2695767/unable-to-programatically-scroll-to -last-item-in-jlist – Reimeus 2012-07-16 17:39:27

+0

我读过它了......我不需要引用JList来调用ensureIndexIsVisible?我如何从ListModel中获取此引用? – JFTxJ 2012-07-16 17:41:31

回答

2

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

我也许会延长JList中&使用专门的内部监听器,但归结到您的要求

+0

这是没有道理的....... – JFTxJ 2012-07-16 18:17:15

+0

它完美的作品!感谢MadProgrammer :-) – JFTxJ 2012-07-16 19:00:23

+0

很高兴为您服务:D – MadProgrammer 2012-07-16 20:15:49