我正在尝试使用JTextArea实现JScrollPane。 JTextArea被附加到,我希望JScrollPane在添加更多文本时继续向下滚动。如何实现这一目标?
答案 0 :(得分:37)
对于(我认为)更简单的答案,请查看:Text Area Scrolling。
在JDK5之前,您必须在每次追加后手动更改插入符号的位置。您现在可以将此行为设置为默认值,如下所示:
JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
这样做的好处是您不需要在代码中多次使用此代码段!
答案 1 :(得分:7)
我在这里找到答案: JScrollPane and JList auto scroll
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
e.getAdjustable().setValue(e.getAdjustable().getMaximum());
}
});
答案 2 :(得分:6)
如果您经常向其写入数据,您可以使用:
textArea.setCaretPosition(textArea.getDocument().getLength());
添加新数据后。
这会自动滚动到JScrollPane。
答案 3 :(得分:6)
这是解决方案。
JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);`
答案 4 :(得分:1)
可以解决这个问题:您可以将该侦听器声明为类,然后在需要它的事件上实例化它。之后,您可以在强制重新绘制屏幕后删除该类。像魅力一样。
答案 5 :(得分:0)
(PS:编辑SCREEN SHOOT)
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);
}
}
答案 6 :(得分:0)
被接受的解决方案很好,但是仅当文本区域是可编辑的,即没有jTextArea.setEditable(false)
时才有效。 Krigath建议的解决方案较为笼统,但存在此处JScrollPane and 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();
});
然后,仅当垂直滚动条展开时,才响应于附加的文本行向下滚动窗格。
我承认,可以找到一种无需额外变量即可过滤事件的方法,如果有人发布它,我们将不胜感激。