1

我正在构建一个来设置包含 a和 a 的JScrollPane可滚动a 。JPanelJTextPaneJTable

当我加载框架时,我JTextPane用很长的文本初始化,然后滚动条向下移动直到我的文档末尾。

我想把这个滚动条放在文档的顶部。因此,在文本加载后,我将滚动条的值设置为 0:

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        myScrollPane.getVerticalScrollBar().setValue(0);
    }
});

它工作正常(即我得到顶部的滚动条),但呈现的行为非常难看。现在它加载文本,显示结尾(滚动条位于文本窗格的底部),然后立即(几毫秒,但仍然可见)向上移动以使滚动条位于顶部。由此产生的效果对用户来说是一种“闪光”,这是非常不愉快的。每次重新加载整个文档时,我都会遇到同样的问题。

我怎么能避免呢?

谢谢。

4

2 回答 2

2

您可以JTextPane在更新其内容之后但在创建之前将您的插入符号位置简单地设置为 0 JScrollPane。这将强制JScrollPane立即显示文本的开头,而无需向后滚动。

只需执行以下操作:

JTextPane textPane = new JTextPane ();
textPane.setText ( "Some long text here..." );
textPane.setCaretPosition ( 0 );

JScrollPane scrollPane = new JScrollPane ( textPane );

如果您已经有文本 - 只需在 EDT 中同时进行更新和插入符号位置切换:

public static void main ( String[] args ) throws InterruptedException
{
    final JFrame frame = new JFrame ();

    final JTextPane textPane = new JTextPane ();
    frame.add ( new JScrollPane ( textPane ) );

    frame.setSize ( 400, 300 );
    frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );

    Thread.sleep ( 2000 );
    SwingUtilities.invokeLater ( new Runnable ()
    {
        public void run ()
        {
            textPane.setText ( "line\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" );
            textPane.setCaretPosition ( 0 );
        }
    } );

    Thread.sleep ( 2000 );
    SwingUtilities.invokeLater ( new Runnable ()
    {
        public void run ()
        {
            textPane.setText ( "line2\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" +
                    "\nline\nline\nline\nline\nline\nline\nline\nline\nline" );
            textPane.setCaretPosition ( 0 );
        }
    } );
}

但我同意这不是最好的解决方案。我想没有简单的方法可以在其内容更改时强制 textpane 插入符号为 0。

于 2012-09-24T15:23:54.040 回答
2

最后我把默认插入符号放到NEVER_UPDATE.

JTextPane textPane = new JTextPane();
DefaultCaret caret = (DefaultCaret) textPane.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);

setUpdatePolicy(). 然后我自己更新插入符号。

于 2012-09-25T07:34:42.003 回答