これは、奇妙なスクロール動作を示す小さな 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);
}
});
}
}