JTextPane将其父Scrollpane滚动到底部

时间:2013-01-11 11:22:55

标签: java swing scroll jscrollpane jtextpane

这是一个小小的SSCCE,它显示了奇怪的滚动行为。当您启动它时,它会向下滚动到滚动窗格的底部。但我希望它能保持领先地位。到目前为止,我发现,这只发生在JTextPanes上,甚至没有JTextArea。只有你在美国东部时间才会发生这种情况。从SSCCE中删除invokeLater(),它按预期工作。但是,这不是解决方案(对我而言)。

我也试过了,但没有效果:

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);

            }
        });

    }

}

1 个答案:

答案 0 :(得分: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中。)