【问题标题】:JTextPane is scrolling its parent Scrollpane to the bottomJTextPane 正在将其父 Scrollpane 滚动到底部
【发布时间】:2013-01-11 11:22:55
【问题描述】:

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

            }
        });

    }

}

【问题讨论】:

  • 嗯...为什么有多个文本窗格?如果它们是故意的,我们将不得不深入研究组件的添加,而不是插入符号/文本窗格本身。
  • @kleopatra 是的,这是故意的。我无法改变它。深入研究添加组件是什么意思? JPanel 和 BoxLayout 是标准组件,如何影响添加过程?不过,我只是好奇。其实我对目前的解决方案很满意。

标签: java swing scroll jscrollpane jtextpane


【解决方案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 中......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2010-11-25
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多