2013-01-11 21 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 ..)