java - JScrollPane 滚动条在 JEditorPane.setText() 上向下跳转

标签 java swing jscrollpane jeditorpane

每次(除了第一次)我在 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("<a href=''>Change Text</a><br><br><br><br><br><br><br><br><br><br>bla");
        this.dataDisplayer.addHyperlinkListener(this);
        setContentPane(jsp);
    }

    @Override
    public void hyperlinkUpdate(HyperlinkEvent arg0) {
        dataDisplayer.setText("<a href=''>Change Text</a><br><br><br><br><br><br><br><br><br><br>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("<a href=''>Change Text</a><br><br><br><br><br><br><br><br><br><br>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("<a href=''>Change Text</a><br><br><br><br><br><br><br><br><br><br>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();
            }
        });
    }
}

关于java - JScrollPane 滚动条在 JEditorPane.setText() 上向下跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11291353/

相关文章:

java - 不正确的 GridBagLayout 行为

java - Swing JScrollPane - 如何将垂直滚动条设置为左侧?

Java Eclipse 求值表达式

java - Hibernate Validator 注释不适用于 spring mvc

java - 为什么 getScaledInstance() 不起作用?

java - 关于在java中绘制多边形

java - 了解引用带宽

java - "Tell Don' t 请问,"shouldn' t所有方法都无效吗?

Java JFrame setSize 导致滞后

java - 如何使 JScrollPane 在 JFrame 中居中?