2009-10-26 27 views
57

Tôi đã nhúng một JTextArea trên một JScrollPane và đang sử dụng JTextArea đó cho đầu ra.Làm thế nào để đặt AUTO-SCROLLING của JTextArea trong Java GUI?

Tôi muốn rằng bất cứ khi nào ouput vượt quá kích thước của JTextArea, JTextArea sẽ tự động cuộn để người dùng không phải thực hiện cuộn xuống để xem kết quả gần đây.

Tôi có thể làm như thế nào?

Tôi đã đặt thuộc tính autoscroll của cả JTextArea và JScrollPane thành true.

Trả lời

130

Khi sử dụng JDK1.4.2 (hoặc sớm hơn) đề nghị phổ biến nhất bạn sẽ tìm thấy trong các diễn đàn là sử dụng mã như sau:

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

Tuy nhiên, tôi đã chỉ nhận thấy rằng trong JDK5 vấn đề này có thực sự đã được giải quyết bằng thay đổi API. Bây giờ bạn có thể kiểm soát hành vi này bằng cách đặt thuộc tính trên DefaultCaret của vùng văn bản. Sử dụng phương pháp này mã sẽ là:

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

Một bản mô tả chi tiết hơn về chủ đề này có thể được tìm thấy ở đây: Text Area Scrolling

+0

@camickr, tôi không thể truy cập vào liên kết, tôi đang ngồi đằng sau một bức tường lửa của công ty. Bạn có thể đăng nội dung quan trọng từ liên kết đó, thứ tôi sẽ bỏ phiếu cho bạn :) Cảm ơn bạn. –

+1

Bất kỳ ý tưởng nào tại sao điều này có thể không hoạt động (đối với những gì nó đáng được tạo ra bằng cách sử dụng trình tạo Netbeans)? –

+0

@ cyber-monk, Không. Tạo SSCCE. Nếu nó vẫn không hoạt động thì bạn có thể tạo một câu hỏi và đăng SSCCE của bạn. – 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

Hãy thử điều này:

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

không .............. – mKorbel

2

Khi bạn nhấp vào bất cứ nơi nào trên JTextArea, tự động cuộn có thể được dừng lại. Vì vị trí của dấu mũ đã thay đổi một lần, điểm nhìn cũng thay đổi. Trong thời gian này, bạn nên đặt vị trí dấu mũ khi bạn thêm hoặc thêm một số văn bản. Trên đường đi, tôi đã thực hiện phương pháp bao gồm thiết lập vị trí dấu mũ, và sau đó sử dụng nó khi bất cứ thứ gì được thêm vào hoặc nối thêm.

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

Sử dụng này để thay thế

JTextArea textArea = new JTextArea(); 
DefaultCaret caret = (DefaultCaret)textArea.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 
scrollPane = new JScrollPane(); 
scrollPane.add(textArea); 
scrollPane.setViewportView(textArea); 
Các vấn đề liên quan