JTextPane的是滚动其父滚动面板的底部(JTextPane is scrolling its

2019-10-17 14:11发布

这里是一个LITTEL 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);

            }
        });

    }

}

Answer 1:

怪异啄:设置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面板..)



文章来源: JTextPane is scrolling its parent Scrollpane to the bottom