JScrollPane滚动条跳转到JEditorPane.setText()

每次(除了第一次)我在JEditorPane滚动条中设置文本跳转到JEditorPane的底部。 有什么方法可以避免这种情况吗? 我试过的一种方法是在setText()之后使用setCaretPosition(0)。 它有效,但它不是我需要的。 滚动条跳下然后跳起来。 有没有办法避免在settext()中滚动条的任何移动?

我的代码:

package test; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JScrollPane; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; public class Test extends JApplet implements HyperlinkListener { JEditorPane dataDisplayer = new JEditorPane(); public void init() { ataDisplayer.setEditable(false); dataDisplayer.add(new JButton()); dataDisplayer.setContentType("text/html"); JScrollPane jsp = new JScrollPane(dataDisplayer); dataDisplayer.setText("Change Text









bla"); this.dataDisplayer.addHyperlinkListener(this); setContentPane(jsp); } @Override public void hyperlinkUpdate(HyperlinkEvent arg0) { dataDisplayer.setText("Change Text









bla bla"); } }

有不同的方法可以解决这个问题。 一个是简单地避免插入符号可见性调整,如下所示:

 import java.awt.Rectangle; import javax.swing.JButton; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.DefaultCaret; public class TestEditorPane implements HyperlinkListener { private final class MyCaret extends DefaultCaret { @Override protected void adjustVisibility(Rectangle nloc) { } } JEditorPane dataDisplayer = new JEditorPane(); private MyCaret caret; @Override public void hyperlinkUpdate(HyperlinkEvent arg0) { dataDisplayer.setText("Change Text









bla bla"); } public void init() { JFrame frame = new JFrame(); dataDisplayer.setEditable(false); caret = new MyCaret(); dataDisplayer.setCaret(caret); dataDisplayer.add(new JButton()); dataDisplayer.setContentType("text/html"); JScrollPane jsp = new JScrollPane(dataDisplayer); dataDisplayer.setText("Change Text









bla"); this.dataDisplayer.addHyperlinkListener(this); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(jsp); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new TestEditorPane().init(); } }); } }

经过50分钟的绝望后,以下问题解决了我:

 JEditorPane.grabFocus(); JEditorPane.setCaretPosition(20);