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