1

私は比較的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.");
    }
}
4

1 に答える 1

2

個人的には、このようなモデルからUIを直接変更しようとはしません。問題のリストへの参照を使用して別のリスナーをモデルにアタッチすることをお勧めします。これにより、ソリューションが再利用可能になります。

jlistを拡張して、専用の内部リスナーを使用したくなるかもしれませんが、それはあなたの要件に帰着します

于 2012-07-16T18:10:25.657 に答える