如何修复JTextArea滚动到底部?

时间:2013-12-21 14:21:28

标签: java swing

我已经看过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

3 个答案:

答案 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(”...)。我摆脱了这个问题,但请记住,在更新时无法修复插入位置。