web-dev-qa-db-ja.com

JScrollPaneを自動的に一番下までスクロールさせる

JTextAreaでJScrollPaneを実装しようとしています。 JTextAreaが追加されているので、さらにテキストが追加されてもJScrollPaneが下にスクロールし続けたいと思います。どうすればこれを達成できますか?

20
Krigath

(私が何を考えているか)より簡単な答えをチェックしてください: テキスト領域のスクロール

JDK5以前は、追加するたびにキャレットの位置を手動で変更する必要がありました。これで、この動作を次のようにデフォルトとして指定できます。

 JTextArea textArea = new JTextArea();
 DefaultCaret caret = (DefaultCaret)textArea.getCaret();
 caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

この利点は、コード内でこのスニペットを2回以上使用する必要がないことです。

38
camickr

私はここで答えを見つけました: JScrollPaneおよびJList auto scroll

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

これが解決策です。

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 
6
Jeevan B. Manoj

常にデータを書き込んでいる場合は、以下を使用できます。

textArea.setCaretPosition(textArea.getDocument().getLength());

新しいデータを追加した直後。

これにより、JScorllPaneまで自動的にスクロールします。

6
Harold Martin

承認されたソリューションはうまく機能しますが、テキスト領域が編集可能である場合、つまりjTextArea.setEditable(false)がない場合のみです。 Krigath によって提案されたソリューションはより一般的ですが、ここで質問されたように問題があります JScrollPaneおよびJList auto scroll 。その質問からの回答を使用すると、一般的な解決策を得ることができます、例えば:

        JScrollPane scrollPane = new JScrollPane(jTextArea);

    verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
    scrollPane.getVerticalScrollBar().addAdjustmentListener(
            e -> {
                if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
                    return;
                e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
            });

ペインは、追加されたテキスト行に応じて、垂直スクロールバーが拡大しているときにのみ下にスクロールされます。

追加の変数なしでイベントをフィルターするメソッドが見つかることは認めます。誰かが投稿してくれれば幸いです。

1
user9999

回避策は可能です。そのリスナーをクラスとして宣言し、それを必要なイベントでインスタンス化できます。その後、画面の再描画を強制した後でクラスを削除できます。魅力のように機能します。

1
Primark

私の解決策 Screen Shoot

Alternative SC Link (PS:スクリーンショット用に編集)

import javax.swing.*;
import javax.swing.text.DefaultCaret;

public class NewClass {

    public static void main(String[] args) {
        JFrame win = new JFrame("test");
        win.setSize(800, 500);
        win.setResizable(false);
        win.setLayout(null);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setLocationRelativeTo(null);

        JTextArea txtListNum = new JTextArea();
        JScrollPane barList = new JScrollPane(txtListNum);
        DefaultCaret crList = (DefaultCaret) txtListNum.getCaret();
        crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        barList.setLocation(10, 10);  // Scrollbar Position
        barList.setSize(180, 450);   // Scrollbar Dimession
        win.add(barList);            // Scrolbar add to Frame

        win.setVisible(true);

    }

}
0
Yusuf Kalsen