1

aとaを含むJScrollPaneスクロール可能な a を設定する a を構築しています。JPanelJTextPaneJTable

フレームをロードするJTextPaneと、非常に長いテキストで初期化され、スクロール バーがドキュメントの最後まで下に移動します。

代わりに、このスクロール バーをドキュメントの上に表示したいと思います。したがって、テキストの読み込み後、スクロール バーの値を 0 に設定します。

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

正常に動作します (つまり、スクロール バーが一番上に表示されます) が、レンダリングされた動作はかなり醜いです。これで、テキストが読み込まれ、最後が表示され (テキスト ペインの下部にスクロール バーが表示されます)、すぐに (数ミリ秒ですが、まだ表示されます) スクロール バーが上部に移動します。結果として生じる効果は、ユーザーにとって非常に不快な「フラッシュ」です。そして、ドキュメント全体をリロードするたびに同じ問題が発生します。

どうすればそれを回避できますか?

ありがとう。

4

2 に答える 2

2

最後に、デフォルトのキャレットを に置きますNEVER_UPDATE

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

のドキュメントはこちらsetUpdatePolicy()です。次に、自分でキャレットを更新します。

于 2012-09-25T07:34:42.003 に答える
2

JTextPaneコンテンツを更新した後、作成する前に、のキャレット位置を 0 に設定するだけですJScrollPaneJScrollPaneこれにより、無意味に後方にスクロールすることなく、テキストの先頭をすぐに表示することが強制されます。

次のようなことをしてください:

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 に答える