Java 如何修复JTextArea滚动到底的问题?

Java 如何修复JTextArea滚动到底的问题?,java,swing,Java,Swing,我已经看到: 这很有效。当更新到JTextArea时,滚动条会自动移动到底部,以便我可以看到刷新数据。但问题是,当我单击JTextArea中的任意空格时,自动滚动就停止了。没有更多的自动滚动工作。如何修复它 补充:我向blackArea添加了文本,调用GUI.blackArea.appendbla-bla-bla;GUI是包含上述代码的类名。感谢@hovercraft充满鳗鱼,您不会显示在JTextArea中添加或附加文本的位置,这是至关重要的,因为插入符号位置的更改应该发生在那里 编辑 你说:

我已经看到:

这很有效。当更新到JTextArea时,滚动条会自动移动到底部,以便我可以看到刷新数据。但问题是,当我单击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的答案,而不是我的答案。