JTextAreaでJScrollPaneを実装しようとしています。 JTextAreaが追加されているので、さらにテキストが追加されてもJScrollPaneが下にスクロールし続けたいと思います。どうすればこれを達成できますか?
(私が何を考えているか)より簡単な答えをチェックしてください: テキスト領域のスクロール 。
JDK5以前は、追加するたびにキャレットの位置を手動で変更する必要がありました。これで、この動作を次のようにデフォルトとして指定できます。
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
この利点は、コード内でこのスニペットを2回以上使用する必要がないことです。
私はここで答えを見つけました: JScrollPaneおよびJList auto scroll
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
これが解決策です。
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
常にデータを書き込んでいる場合は、以下を使用できます。
textArea.setCaretPosition(textArea.getDocument().getLength());
新しいデータを追加した直後。
これにより、JScorllPaneまで自動的にスクロールします。
承認されたソリューションはうまく機能しますが、テキスト領域が編集可能である場合、つまり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();
});
ペインは、追加されたテキスト行に応じて、垂直スクロールバーが拡大しているときにのみ下にスクロールされます。
追加の変数なしでイベントをフィルターするメソッドが見つかることは認めます。誰かが投稿してくれれば幸いです。
回避策は可能です。そのリスナーをクラスとして宣言し、それを必要なイベントでインスタンス化できます。その後、画面の再描画を強制した後でクラスを削除できます。魅力のように機能します。
(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);
}
}