Java 如何修复JTextArea滚动到底的问题?
我已经看到: 这很有效。当更新到JTextArea时,滚动条会自动移动到底部,以便我可以看到刷新数据。但问题是,当我单击JTextArea中的任意空格时,自动滚动就停止了。没有更多的自动滚动工作。如何修复它Java 如何修复JTextArea滚动到底的问题?,java,swing,Java,Swing,我已经看到: 这很有效。当更新到JTextArea时,滚动条会自动移动到底部,以便我可以看到刷新数据。但问题是,当我单击JTextArea中的任意空格时,自动滚动就停止了。没有更多的自动滚动工作。如何修复它 补充:我向blackArea添加了文本,调用GUI.blackArea.appendbla-bla-bla;GUI是包含上述代码的类名。感谢@hovercraft充满鳗鱼,您不会显示在JTextArea中添加或附加文本的位置,这是至关重要的,因为插入符号位置的更改应该发生在那里 编辑 你说:
补充:我向blackArea添加了文本,调用GUI.blackArea.appendbla-bla-bla;GUI是包含上述代码的类名。感谢@hovercraft充满鳗鱼,您不会显示在JTextArea中添加或附加文本的位置,这是至关重要的,因为插入符号位置的更改应该发生在那里 编辑 你说:
对不起,我只是在其他类中追加文本,只是调用GUI.blackArea.appendbla-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
}
});
}
}
您不会显示要在JTextArea中添加或追加文本的位置,这是至关重要的,因为插入符号位置的更改应该发生在那里 编辑 你说:
对不起,我只是在其他类中追加文本,只是调用GUI.blackArea.appendbla-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
}
});
}
}
退房。与其他滚动答案相比,这是一个改进
如果scrollpane位于底部,则当追加发生时,它将继续保持scrollpane位于底部。但是,如果用户已从底部移动视口,则附加将不会自动滚动到底部。签出。与其他滚动答案相比,这是一个改进
如果scrollpane位于底部,则当追加发生时,它将继续保持scrollpane位于底部。但是,如果用户已从底部移动视口,则附加将不会自动滚动到底部。我解决了此问题。这是观点的问题。当我单击JTextarea上的任何空格时,插入符号的位置会发生变化,因此视点也会发生变化。按照我的代码,没有对view point进行更新 因此,我提出了一个方法:
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());
}
});
}
我改变了黑区。附加。。。要添加日志。。。。我解决了这个问题,但是,请记住,更新时无法修复插入符号位置。我解决了这个问题。这是观点的问题。当我单击JTextarea上的任何空格时,插入符号的位置会发生变化,因此视点也会发生变化。按照我的代码,没有对view point进行更新 因此,我提出了一个方法:
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());
}
});
}
我改变了黑区。附加。。。要添加日志。。。。但是,我解决了这个问题,请记住,更新时无法修复插入符号的位置。对不起,我只是在其他类中追加文本,只是调用GUI.blackArea.appendbla-bla;我应该使用SwingUtilities.invokeLater吗?谢谢+1你的意见和评论!祝你圣诞快乐@user3100921:如果您的大多数解决方案都来自camickr,那么您可能应该接受camickr的答案,而不是我的答案;我应该使用SwingUtilities.invokeLater吗?谢谢+1你的意见和评论!祝你圣诞快乐@user3100921:如果您的大多数解决方案都来自camickr,那么您可能应该接受camickr的答案,而不是我的答案。