2013-12-21 4 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에서 임의의 공간을 클릭하면 자동 스크롤이 중지된다는 것입니다. 더 이상 자동 스크롤이 작동하지 않습니다. 어떻게 고칠 수 있습니까?

보완하는

: 나는 GUI.blackArea.append("bla bla bla"); GUI를 호출하면 위의 코드가 포함 된 클래스 이름입니다 blackArea에 텍스트를 추가했다. @ hovercraft-full-of-eels에 감사드립니다.

답변

3

체크 아웃 Smart Scrolling. 다른 스크롤링 대답보다 개선 된 점입니다.

추가가 발생할 때 스크롤 패널이 맨 아래에 있으며 스크롤 패널을 계속 하단에 유지합니다. 그러나 사용자가 뷰포트를 맨 아래에서 이동하면 추가는 자동으로 맨 아래로 스크롤되지 않습니다.

+0

감사합니다. 나는 문제를 해결했다. – Juntae

2

JTextArea에 텍스트를 추가하거나 추가하는 위치를 표시하지 않으며, 캐럿 위치 변경이 발생해야하므로 중요합니다.


편집
당신 상태 :

미안 해요, 난 그냥 ("어쩌구 어쩌구 저쩌구") 단지 GUI.blackArea.append를 호출, 다른 클래스의 텍스트를 추가; SwingUtilities.invokeLater를 사용해야합니까?

저는 Rob Camick, 진정한 스윙 전문가에게서 괜찮은 답변을 얻었습니다. 그러나 클래스의 필드를 그런 식으로 공개해서는 안된다는 사실을 추가해야합니다. 코드가 제안했듯이 정적으로 선언 됨). 대신 필드의 상태를 변경하는 제어 된 기능을 허용하는 공용 메소드를 노출합니다.

public void blackAreaAppend(String text) { 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     blackArea.append(text); 
     // code here to advance cursor 
    } 
    }); 
} 

또는 경우 그냥 확실하지 않다 :

예를 들어 당신의 GUI 클래스는이 방법이 항상 동부 서머 타임 오프를 호출하는 경우 그래서
public void blackAreaAppend(String text) { 
    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을 +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()); 
        } 
    }); 
    

    }

내가 addLog`에 blackArea.append("...") 변경을 ("...) 나는이 문제에서있어, 그러나 업데이트하는 동안 캐럿 위치를 수정할 수는 없습니다.

관련 문제