私は比較的Javaに不慣れで、特にスイングに慣れていません。私はNetbeans6.8で開発しています。
カスタムAbstractListModelを使用するJListがあります。このAbstractListModelは、データベース内のデータへの変更を追跡し、新しい要素がリストに追加されるときにfireIntervalAddedを呼び出します。これは完全に機能します。
私が抱えている問題は、JList(またはJScrollPane)がリスト内の新しい要素に自動的にスクロールするようにしたいということです。JList.ensureIndexIsVisibleを使用できることを読みましたが、関連するListModelからJListのインスタンスへの参照を取得する方法がわかりません(ListModel内から「fireIntervalAdded」を起動しているため)。
少し説明すると、SQLサーバーからの新しいデータをポーリングするためにListModel内にポーラーを構築しました。ListModelをリストの「データソース」と見なしているため、このListModel内にデータ取得(および私の場合はポーリング)ロジックを配置することが重要になりました。チュートリアルは、モデル自体からのコントロールスクロールのこの特定の必要性をカバーしていないようです(ListModelは一度に複数のJListで使用できるため、これは理にかなっています.....)
何ができますか-ListModelコード内から最後に作成された要素までJListをスクロールさせるにはどうすればよいですか?
また、新しい要素が追加されたときに発生するイベントをJListで見つけることができれば、問題を解決できると思いますが、見つかりませんでした。
ありがとう
- 編集 -
OK、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.");
}
}