14

私は次のコードを持っています:

    listModel = new DefaultListModel();
    listModel.addElement(dateFormat.format(new Date()) + ": Msg1");
    messageList = new JList(listModel);
    messageList.setLayoutOrientation(JList.VERTICAL);

    messageScrollList = new JScrollPane(messageList);
    messageScrollList.setPreferredSize(new Dimension(500, 200));

    messageScrollList.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
        public void adjustmentValueChanged(AdjustmentEvent e) {  
            e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
        }
    }); 

自動スクロールダウンします。しかし、メッセージを読み直すために上にスクロールしようとすると、強制的に下にスクロールします。どうすればこれを修正できますか?

4

7 に答える 7

10

新しいメッセージを追加するときは、メッセージペインの推奨サイズと同じサイズのを使用してをscrollRectToVisible()呼び出します。垂直方向を考えると、の推奨サイズをメッセージペインの高さの整数倍にするのが便利な場合があります。参照:スクロールペインの使用方法JListRectangleJScrollPaneJViewport

補遺:テキスト領域のスクロールに関するこの説得力のある議論も役立つかもしれません。

于 2010-01-25T17:24:12.903 に答える
3
this.list = blah blah... 
this.list.setSelectedValue(whatever);   
final JScrollPane sp = new JScrollPane(this.list); // needs to be after the parent is the sp 
this.list.ensureIndexIsVisible(this.list.getSelectedIndex());
于 2010-03-31T17:26:57.690 に答える
1

これは本当に便利だと思いました: http://forums.sun.com/thread.jspa?threadID=623669 (「inopia」による投稿)
完全に動作します

彼が言うように、「ここでの問題は、ListModel、JList、および JScrollPane の両方が更新された後に発生するイベントを見つけるのが少し難しくなる可能性があることです。」

于 2010-06-15T04:54:25.187 に答える
0

あなたがやりたいことは、調整ではなく、messageListに何かを追加するときに下にスクロールすることだと思います。したがって、コードは次のようになります。

Adjustable sb = messageScrollList.getVerticalScrollBar()
boolean onBottom = sb.getValue() == sb.getMaximum();
//
// add your message to the JList.
//
if(onBottom)  sb.setValue(sb.getMaximum());

それ以外の場合は、調整がモデルの変更によって引き起こされたのか、マウスによって引き起こされたのかを知る必要があり、API ドキュメントを調べても、簡単に行う方法があるかどうかわかりません。AdjustmentEvent.getAdjustmentType()これらの場合に が異なる値を返すかどうかはわかりますが、それが真である場合は、匿名の内部クラスに if ステートメントを含めることができます。

あなたが試すことができるもう1つのことは、リストに何かを追加したときに設定されるブール変数をどこかに置くことです。次に、ハンドラーで、変数が設定されているかどうかを確認します。そうであれば、調整を行い (そして変数を設定解除し)、それ以外の場合は無視します。そうすれば、リストに追加されるアイテムごとにスクロールダウンが 1 つだけになります。

于 2010-01-25T13:27:08.727 に答える
-1

自動スクロールするには、静的変数と list.makeVisible(int index) という非常に単純な概念を使用しています

    public class autoScrollExample
    {
     static int index=0;
     private void someFunction()
     /*   
     * 
     */
     list1.add("element1");
     list1.makeVisible(index++);
     /*
     *
     */

     private void someOtherFunction()
     /*   
     * 
     */
     list1.add("element2");
     list1.makeVisible(index++);
     /*
     *
     */


    }
于 2013-11-06T07:22:18.103 に答える