这是一个小小的SSCCE,它显示了奇怪的滚动行为。当您启动它时,它会向下滚动到滚动窗格的底部。但我希望它能保持领先地位。到目前为止,我发现,这只发生在JTextPanes上,甚至没有JTextArea。只有你在美国东部时间才会发生这种情况。从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);
}
});
}
}
答案 0 :(得分: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中。)