JScrollPane 失去焦点时失去滚动位置

JScrollPane loses scroll position when focus lost

我正在开发旧版 Swing 应用程序。

此应用在 JScrollPane 中有自定义的 JTextArea

我遇到的问题是,当应用程序失去焦点时(例如,Alt-Tabs 到另一个应用程序),滚动条和插入符号位置 return 到顶部。我想要发生的是,当失去焦点时,插入符号位置和滚动值保持不变。

我目前有一个焦点侦听器,它在失去焦点时存储插入符号位置和滚动条值,并在获得焦点时重新设置它。哪个有效。然而它看起来有点不稳定,因为当失去焦点时滚动条仍然跳到顶部并在获得焦点时返回。

有没有办法抑制焦点事件,或者在失去焦点时停止滚动条移动?

鉴于它不会出现在这个更简单的代码中,我的建议是:- 更改代码中 首先导致问题的任何内容。

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ScrollPosition {

    private JComponent ui = null;

    ScrollPosition() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        JTextArea ta = new JTextArea(4, 20);
        ui.add(new JScrollPane(ta));
        String eol = System.getProperty("line.separator");

        for (int i=0; i<100; i++) {
            ta.append("Blah blah.. " + i + eol);
        }
        ta.setCaretPosition(0);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                ScrollPosition o = new ScrollPosition();

                JFrame f = new JFrame("Scroll Position");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

我敢打赌有人构建了一个功能来向上滚动并在每次 JTextArea 的内容通过 setText()append() 更改时显示文本的开头。

And 还有一个 (Window, Focus, Document or PropertyChange) ListenerJFrame 停用时(可能保存并)刷新 JTextArea 的内容以不丢失任何用户编辑。

这两个功能不能很好地结合在一起...