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