这是一个littel SSCCE,它显示了奇怪的滚动行为。当你启动它时,它会滚动到滚动条的底部。但我希望它保持在最佳状态。到目前为止,我发现,这只发生在JTextPanes上,甚至没有发生在JTextArea上。这也只会发生,如果你在美国东部时间。从SSCCE中删除invokeLater(),它按预期工作。然而,这不是一个解决方案(对我来说)。JTextPane正在将其父级Scrollpane滚动到底部
我也试过了,但没有效果:
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);
}
});
}
}
嗯...为什么多个文本窗格?如果他们是故意的,我们将不得不深入添加组件,而不是插入/文本面板本身。 – kleopatra
@kleopatra是的,这是故意的。我无法改变它。 挖掘组件的添加意味着什么? JPanel和BoxLayout是标准组件,所以我如何影响添加过程?不过,我只是好奇而已。其实我对目前的解决方案非常满意。 – haferblues