我已经看过:How to set AUTO-SCROLLING of JTextArea in Java GUI?
blackArea = new JTextArea();
blackArea.setFont(new Font("Tahoma", Font.BOLD, 11));
blackArea.setText("Loggend on Administrator...\n" +date);
blackArea.setForeground(Color.RED);
blackArea.setBackground(Color.BLACK);
DefaultCaret caret = (DefaultCaret)blackArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
blackArea.setCaretPosition(blackArea.getDocument().getLength());
scrollPane.setViewportView(blackArea);
这很有效。当更新到JTextArea时,滚动自动移动到底部,因此我可以看到刷新数据。 但问题是,当我点击JTextArea中的任何空格时,自动滚动停止。没有更多自动滚动功能。如何解决?
补充:我向blackArea
添加了文字,调用GUI.blackArea.append("bla bla bla");
GUI是类名,其中包含上述代码。感谢@ hovercraft-full-of-eels
答案 0 :(得分:3)
结帐Smart Scrolling。这是对其他滚动答案的改进。
当附加物发生时,滚动窗格位于底部,它将继续将滚动窗格保持在底部。但是,如果用户已从底部移动视口,则追加将不会自动滚动到底部。
答案 1 :(得分:2)
您没有显示您在JTextArea中添加或附加文本的位置,这是至关重要的,因为插入位置的更改应该在那里发生。
修改强>
你说:
抱歉,我只是在其他类中附加文本,只需调用GUI.blackArea.append(“bla bla bla”);我应该使用SwingUtilities.invokeLater吗?
我知道你从Rob Camick那里得到了一个不错的答案,他是一个真正的Swing大师,但我还要补充一点,你真的不应该以这种方式公开你的类的字段(希望你的组件都没有被声明为静态的)你的代码表明它们可能是)。而是公开允许控制能力来改变字段状态的公共方法。例如,您的GUI类可以有一个像这样的公共方法
public void blackAreaAppend(String text) {
blackArea.append(text);
// code here to advance cursor
}
或者,如果这个方法总是从EDT中取消:
public void blackAreaAppend(String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
blackArea.append(text);
// code here to advance cursor
}
});
}
或者如果您不确定:
public void blackAreaAppend(String text) {
if (SwingUtilities.isEventDispatchThread()) {
blackArea.append(text);
// code here to advance cursor
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
blackArea.append(text);
// code here to advance cursor
}
});
}
}
答案 2 :(得分:0)
我解决了这个问题。这是观点问题。当我点击JTextarea上的任何空格时,插入符号的位置会改变,因此视点也会改变。在我的代码之后,没有关于视点的更新。
所以,我做了一个方法:
public static void addLog(final String log){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GUI.blackArea.append(log);
GUI.blackArea.setCaretPosition(GUI.blackArea.getDocument().getLength());
}
});
}
我将blackArea.append("...")
更改为“addLog(”...)。我摆脱了这个问题,但请记住,在更新时无法修复插入位置。