JTextAreaを使用してJScrollPaneを実装しようとしています。JTextAreaが追加されています。テキストが追加されても、JScrollPaneを下にスクロールし続けたいと思います。これはどのように達成できますか?
7 に答える
(私が思うに)もっと簡単な答えについては、テキストエリアのスクロールをチェックしてください。
JDK5より前は、追加するたびに手動でキャレットの位置を変更する必要がありました。これで、この動作をデフォルトとして次のように指定できます。
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
これの利点は、コードでこのスニペットを複数回使用する必要がないことです。
私はここで答えを見つけました: JScrollPane と JList 自動スクロール
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
常にデータを書き込んでいる場合は、次を使用できます。
textArea.setCaretPosition(textArea.getDocument().getLength());
新しいデータを追加した直後。
これにより、JScorllPane が自動的に下にスクロールされます。
回避策は可能です。そのリスナーをクラスとして宣言し、必要なイベントでインスタンス化することができます。その後、画面の再描画を強制した後にクラスを削除できます。魅力のように機能します。
回答を見て、@ user9999の回答は、スクロールバーを継続的にスクロールしたい人にとっては良い解決策であることがわかりました。コードを編集し、変数を削除しました。ユーザーが手動でスクロールしているときに、スクロールを停止します。ユーザーが textarea または scrollarea の最後までスクロールすると、自動スクロールが続行されます。
(また、@ user9999が示唆したように、変数を削除しjScrollPane1.getHeight()
、現在のスクロールバーの値が最大値よりも低い場合にスクロールを停止するための測定値として追加しました)
回避策は次のとおりです。
jScrollPane1.getVerticalScrollBar().addAdjustmentListener(
e -> {
if ((e.getAdjustable().getValue() - e.getAdjustable().getMaximum()) > -jScrollPane1.getHeight() - 20){
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
編集:
それがないとスクロールしないことがあるので、 TextArea-20
のフォントサイズに応じて変更できると思います。-jScrollPane1.getHeight() - 20
-20