1

这是一个小 SSCCE,它显示了奇怪的滚动行为。当您启动它时,它会向下滚动到滚动窗格的底部。但我希望它保持领先。到目前为止,我发现,这只发生在 JTextPanes 上,甚至不会发生在 JTextArea 上。它也只有在您在 EDT 时才会发生。从 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);

            }
        });

    }

}
4

1 回答 1

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

于 2013-01-11T11:59:06.900 回答