【问题标题】:How to set AUTO-SCROLLING of JTextArea in Java GUI?如何在 Java GUI 中设置 JTextArea 的自动滚动?
【发布时间】:2010-12-10 06:24:11
【问题描述】:

我在 JScrollPane 上嵌入了一个 JTextArea,并使用该 JTextArea 进行输出。

我希望每当输出超出 JTextArea 的大小时,JTextArea 就会自动滚动,这样用户就不必手动向下滚动来查看最近的输出。

我该怎么做?

我已经将 JTextArea 和 JScrollPane 的 autoscroll 属性设置为 true。

【问题讨论】:

    标签: java user-interface swing jscrollpane jtextarea


    【解决方案1】:

    在使用 JDK1.4.2(或更早版本)时,您会在论坛中找到的最常见建议是使用如下代码:

    textArea.append(...);
    textArea.setCaretPosition(textArea.getDocument().getLength());
    

    但是,我刚刚注意到,在 JDK5 中,这个问题实际上已通过 API 更改得到解决。您现在可以通过在文本区域的 DefaultCaret 上设置属性来控制此行为。使用这种方法,代码将是:

    JTextArea textArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)textArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    

    注意:

    上述设置插入符号更新策略的建议不起作用。

    相反,您可能想查看Smart Scrolling,它使用户能够确定何时应该自动滚动。

    关于文本区域自动滚动的更详细描述可以在这里找到:Text Area Scrolling

    【讨论】:

    • @camickr,我无法访问链接,我坐在公司防火墙后面。你能从那个链接发布重要的东西吗?我会投票给你的:)谢谢。
    • 任何想法为什么这可能不起作用(因为它的价值是使用 Netbeans 构建器创建的表单)?
    • @cyber-monk,不,创建一个 SSCCE。如果它仍然不起作用,那么您可以创建一个问题并发布您的 SSCCE。
    • 我从您的回答中删除了您的附注 - 如果这仍然是一个问题,请在 Meta Stack Overflow 上发布一些内容。
    • 根据您的答案中引用的有关文本区域滚动的文章,设置插入符号更新策略不再有效。最好坚持明确设置插入符号的位置。
    【解决方案2】:
        JScrollBar vbar = scrollPane.getVerticalScrollBar();
    
        for (int i = 0; i < 20; i++) {
    
            myJTxt.append("This is text " + i + "\n");
            vbar.setValue(vbar.getMaximum());
            vbar.paint(vbar.getGraphics());
            myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
            myJTxt.paint(myJTxt.getGraphics());
            try {
                Thread.sleep(250);
            } catch (InterruptedException ex) {
                Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    

    【讨论】:

      【解决方案3】:

      当您单击 JTextArea 上的任意位置时,可能会停止自动滚动。因为插入符号的位置一旦改变,视点也改变了。此时,您应该在追加或添加一些文本时设置插入符号位置。在途中,我制作了包括设置插入符号位置的方法,然后在添加或附加任何内容时使用它。

      【讨论】:

        【解决方案4】:
            JTextArea jTextArea = new JTextArea();
            DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
            caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);
        

        【讨论】:

          【解决方案5】:

          我尝试了大多数建议,但是当 JTextArea 的内容变大(几 MB)时遇到了问题。最后,以下显示了最佳性能:

          myTextArea.append( someText );
          myTextArea.getCaret().setDot( Integer.MAX_VALUE );
          

          当然,用户所做的任何选择都会丢失。因此,它仅可用于文本区域的“仅显示”用途。

          不过,在我的安装中,如果 JTextArea 的内容超过 9MB,它就会变得有点不可用(非常迟钝到几乎冻结的 GUI)。

          当文本包含由 UTF-16 编码中的两个字符(两个 16 位单元)表示的字符(所谓的代理对,例如:?)时,会出现类似的现象。我有过滤的解决方案,但可能是不同的主题。

          【讨论】:

            【解决方案6】:

            最好和最简单的方法,试试这个:

              import javax.swing.text.DefaultCaret;
              DefaultCaret caret = (DefaultCaret) textArea.getCaret();
              caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
            

            【讨论】:

              【解决方案7】:

              改用这个

              JTextArea textArea = new JTextArea();
              DefaultCaret caret = (DefaultCaret)textArea.getCaret();
              caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
              scrollPane = new JScrollPane();
              scrollPane.add(textArea);
              scrollPane.setViewportView(textArea);
              

              【讨论】:

                【解决方案8】:

                试试这个:

                JTextArea jTextArea = new JTextArea();
                JScrollPane jScrollPane = new JScrollPane();
                jScrollPane.setViewport(jTextArea);
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-04-27
                  • 1970-01-01
                  • 2015-03-10
                  • 1970-01-01
                  • 2011-04-20
                  • 1970-01-01
                  • 2011-09-08
                  相关资源
                  最近更新 更多