当焦点丢失时,JScrollPane会丢失滚动位置

时间:2015-02-04 13:31:09

标签: java swing jscrollpane

我正在研究传统的应用程序。

此应用在JTextArea中有自定义JScrollPane

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

我目前有一个焦点监听器,可以在焦点丢失时存储插入位置和滚动条值,并在获得焦点时再次设置它。哪个有效。然而,它看起来有点笨拙,因为当焦点丢失时滚动条仍会跳到顶部,并在获得焦点时向后移动。

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

2 个答案:

答案 0 :(得分:4)

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

还有另一个(WindowFocusDocumentPropertyChangeListener(可能会保存)并且当JTextArea被取消激活时,刷新JFrame的内容,以免丢失任何useredits。

这两个功能并不顺利......

答案 1 :(得分:2)

鉴于在这个更简单的代码中没有出现这种情况,我的建议是: - 首先改变导致问题的代码中的任何内容。

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);
    }
}