2010-10-19 85 views
8

這是一段可運行的代碼,顯示了我的「問題」。我有一個JTextArea包裹在JScrollPane。當我更改JTextArea的文本時,JScrollPane會自動滾動到文本的末尾,我不希望這樣。Java/Swing:一個JScrollPane中的JTextArea,如何防止自動滾動?

這裏是我的要求:

  • 應用不應該滾動自動垂直但是...
  • 用戶應該能夠垂直滾動
  • 用戶不應該能夠水平滾動
  • 應用程序絕不應該水平滾動
  • 的JTextArea中一定不能編輯

(所以即使有比可水平適合,無論是應用還是用戶應該可以水平滾動更多的文字。雖然垂直,只有用戶應該能夠滾動。)

我不知道如何「解決」這個:這應該使用JTextAreaJScrollPane方法固定?

注意AFAICT這是在所有的副本:JTextPane prevents scrolling in the parent JScrollPane

這裏的還挺有趣的例子,每200毫秒它把新文本在JTextArea,你可以看到JScrollPane總是自動滾動到文本結尾。

import javax.swing.*; 
import java.awt.*; 
import java.util.Random; 

public final class TextInScrollPane extends JFrame { 

    private static final Random r = new Random(42); 

    public static void main(final String[] args) { 
     final JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     f.setLayout(new BorderLayout()); 
     final JTextArea jta = new JTextArea("Some text", 30, 30); 
     jta.setEditable(false); // This must not be editable 
     final JScrollPane jsp = new JScrollPane(jta); 
     jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     f.add(jsp, BorderLayout.CENTER); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 

     final Thread t = new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try {Thread.sleep(200);} catch (InterruptedException e) {} 
        final StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < 50 + r.nextInt(75); i++) { 
         for (int j = 0; j < r.nextInt(120); j++) { 
          sb.append((char) 'a' + r.nextInt(26)); 
         } 
         sb.append('\n'); 
        } 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          jta.setText(sb.toString()); 
         } 
        }); 
       } 
      } 
     }); 
     t.start(); 
    } 

} 
+0

note to all:有關空* catch *塊和* final *的用法的註釋可以發送到*/dev /空*,這真的不是這個問題是關於;) – SyntaxT3rr0r 2010-10-19 20:16:51

回答

22

How to set AUTO-SCROLLING of JTextArea in Java GUI?

http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/text/DefaultCaret.html#NEVER_UPDATE

嘗試:

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

這應該防止插入符自動將文檔滾動到底部。

+0

I82Much:哦,我喜歡這個更新政策!它也可以完美地工作,它比我的黑客答案(我始終將插入位置重置爲零)更好。 – SyntaxT3rr0r 2010-10-19 23:17:11

1

回答我的問題:我不能完全肯定這是解決我的問題的最佳途徑,但設置使用setCaretPosition(0)似乎做工精細的JTextArea's插入符號:

jta.setText(sb.toString()); 
jta.jta.setCaretPosition(0); 
1

您在執行Document類時遇到了非常奇怪的行爲。我在JScrollPane中的JTextPane中使用了DefaultStyledDocument。

現在,這裏是奇怪的事情。如果我更新EventQueue上的文檔(就像通過安排可運行的日程安排稍後運行一樣),滾動窗格會自動滾動到最後。

但是,文檔類聲稱是線程安全的,實際上可以從另一個線程更新。如果我確定在上更新了另一個線程,那麼EventQueue的一切正常,但滾動窗格不會滾動到結尾。

我沒有解釋爲什麼這樣,我沒有看過Swing源代碼。自2006年以來,我一直在利用這個「功能」,至今一直保持一致:-)

相關問題