2013-01-11 87 views
1

這是一個littel SSCCE,它顯示了奇怪的滾動行爲。當你啓動它時,它會滾動到滾動條的底部。但我希望它保持在最佳狀態。到目前爲止,我發現,這隻發生在JTextPanes上,甚至沒有發生在JTextArea上。這也只會發生,如果你在美國東部時間。從SSCCE中刪除invokeLater(),它按預期工作。然而,這不是一個解決方案(對我來說)。JTextPane正在將其父級Scrollpane滾動到底部

我也試過了,但沒有效果:

final DefaultCaret caret = (DefaultCaret) tp.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); 

我要的是一個乾淨的和通用的解決方案。因此,我想知道實際觸發滾動的內容,因此我可以擴展JTextPane或其使用的StyledDocument或其他任何內容以默認情況下避免這種情況。在我的情況下,我主要使用JTextPane作爲不可編輯的多行文本,因爲它支持文本和不同字體大小和樣式的對齊。所以實際上我可以放棄編輯功能,如果我解決這個滾動問題。如果可能的話,我不想在添加所有內容後設置ScrollPane的滾動位置,因爲我發現這是一個非常糟糕的解決方法。

感謝您的幫助。這裏是SSCCE:

import java.awt.LayoutManager; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 

public class ScrollPaneWithTextPanes 
{ 
    public static void main(final String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      public void run() 
      { 
       final JPanel p = new JPanel(); 
       final LayoutManager layout = new BoxLayout(p, BoxLayout.Y_AXIS); 
       p.setLayout(layout); 

       for (int i = 0; i < 10; i++) 
       { 
        final JTextPane tp = new JTextPane(); 
        tp.setText("This is some text in text pane " + i); 
        p.add(tp); 

        //     final DefaultCaret caret = (DefaultCaret) tp.getCaret(); 
        //     caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); 
       } 

       final JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.getContentPane().add(new JScrollPane(p)); 
       f.setSize(800, 200); 
       f.setLocation(0, 0); 

       f.setVisible(true); 

      } 
     }); 

    } 

} 
+0

嗯...爲什麼多個文本窗格?如果他們是故意的,我們將不得不深入添加組件,而不是插入/文本面板本身。 – kleopatra

+0

@kleopatra是的,這是故意的。我無法改變它。 挖掘組件的添加意味着什麼? JPanel和BoxLayout是標準組件,所以我如何影響添加過程?不過,我只是好奇而已。其實我對目前的解決方案非常滿意。 – haferblues

回答

3

怪異啄:設置textPanes的更新策略有所作爲 - 如果設置文本

for (int i = 0; i < 10; i++) { 
    final JTextPane tp = new JTextPane(); 
    final DefaultCaret caret = (DefaultCaret) tp.getCaret(); 
    caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); 
    tp.setText("This is some text in text pane " + i); 
    p.add(tp); 

    // adding some other components simply leaves the scrollPane at the top 
    // JComponent b = new JButton("This is some text in button " 
    // + i); 
    // p.add(b); 
} 

final JFrame f = new JFrame(); 
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
f.getContentPane().add(new JScrollPane(p)); 

的古怪之前所做的是,它改變滾動行爲在層次結構中較高的一個scrollPane(窗格被添加到一個面板,然後被包裝成一個scrollPane ..)