2013-12-21 63 views
1

我已经看到How to set AUTO-SCROLLING of JTextArea in Java GUI?如何解决JTextArea滚动到底部?

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");图形用户界面是上面的代码包括的类名称。感谢@ hovercraft-full-of-eels

回答

3

结账Smart Scrolling。这是对其他滚动答案的改进。

当附加发生时,滚动窗格位于底部,它将继续保持滚动窗格位于底部。但是,如果用户从底部移动视口,那么追加将不会自动滚动到底部。

+0

谢谢。我解决了问题。 – Juntae

2

您不会显示您将文本添加或附加到JTextArea的位置,这是至关重要的,因为插入位置的更改应该发生在那里。


编辑
幽州:

对不起,我只是追加在其他类中的文本,只需调用GUI.blackArea.append( “唧唧歪歪”);我应该使用SwingUtilities.invokeLater吗?

我知道你有来自Rob Camick,一个真正的摇摆大师像样的答案,但我还必须补充一点,你真的不应该暴露你的类的字段的方式(希望你无关的部件都声明为静态,因为你的代码表明它们可能是)。相反,公开的方法允许控制能力来改变你的领域的状态。比如你的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 
     } 
    }); 
    } 
} 
+0

对不起,我只是在其他类中追加文本,只是调用'GUI.blackArea.append(“bla bla bla”);'我应该使用'SwingUtilities.invokeLater'吗? – Juntae

+1

@ user3100921:请参阅编辑以回答。 –

+0

谢谢。 +1您的意见和评论!祝你圣诞节愉快! – Juntae

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(” ...),我得到了这个问题,但是,请记住,更新时无法修复插入符号位置。