2009-10-26 15 views
57

Mam osadzone JTextArea na JScrollPane i używam tego JTextArea dla danych wyjściowych.Jak ustawić AUTO-SCROLLING JTextArea w Java GUI?

Chcę, aby zawsze, gdy ouput wykracza poza rozmiar JTextArea, JTextArea przewija się automatycznie, więc użytkownik nie musi ręcznie przewinąć, aby zobaczyć ostatnie wyniki.

Jak mogę to zrobić?

Ustawiłem już właściwość autoscroll obu JTextArea i JScrollPane na true.

Odpowiedz

130

Podczas korzystania JDK1.4.2 (lub wcześniej) najczęstszym sugestia znajdziesz na forach jest użycie kodu jak poniżej:

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

Jednakże, właśnie zauważyłem, że w JDK5 kwestia ta ma faktycznie zostało rozwiązane przez zmianę interfejsu API. Możesz teraz kontrolować to zachowanie, ustawiając właściwość w polu DefaultCaret obszaru tekstowego. Stosując to podejście kod byłoby:

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

Bardziej szczegółowy opis ten temat można znaleźć tutaj: Text Area Scrolling

+0

@camickr, nie może uzyskać dostępu do linku, siedzę za firmowym firewallem. Czy możesz opublikować znaczące rzeczy z tego linku, a ja będę głosować na ciebie :) Dzięki. –

+1

Wszelkie pomysły, dlaczego to może nie działać (na co warto formularz został utworzony za pomocą konstruktora Netbeans)? –

+0

@ cyber-monk, Nie. Utwórz SSCCE. Jeśli nadal nie działa, możesz utworzyć pytanie i opublikować swoje SSCCE. – camickr

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

Spróbuj tego:

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

nie .............. – mKorbel

2

Po kliknięciu w dowolnym miejscu na JTextArea, automatyczne przewijanie można zatrzymać. Ponieważ pozycja karetki została zmieniona, punkt widzenia również się zmienił. W tym czasie powinieneś ustawić pozycję karetki po dodaniu lub dodaniu tekstu. Po drodze stworzyłem metodę obejmującą ustawioną pozycję karetki, a następnie użyłem jej, gdy cokolwiek zostanie dodane lub dołączone.

1
JTextArea jTextArea = new JTextArea(); 
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret(); 
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM); 
-2

Użyj tego zamiast

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