【发布时间】:2013-01-11 11:22:55
【问题描述】:
这是一个小 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);
}
});
}
}
【问题讨论】:
-
嗯...为什么有多个文本窗格?如果它们是故意的,我们将不得不深入研究组件的添加,而不是插入符号/文本窗格本身。
-
@kleopatra 是的,这是故意的。我无法改变它。深入研究添加组件是什么意思? JPanel 和 BoxLayout 是标准组件,如何影响添加过程?不过,我只是好奇。其实我对目前的解决方案很满意。
标签: java swing scroll jscrollpane jtextpane