我正在研究传统的应用程序。
此应用在JTextArea
中有自定义JScrollPane
。
我遇到的问题是,当应用程序失去焦点时(例如,Alt-Tabs到另一个应用程序),滚动条和插入符号位置将返回到顶部。我想要发生的是当焦点丢失时,插入位置和滚动值保持不变。
我目前有一个焦点监听器,可以在焦点丢失时存储插入位置和滚动条值,并在获得焦点时再次设置它。哪个有效。然而,它看起来有点笨拙,因为当焦点丢失时滚动条仍会跳到顶部,并在获得焦点时向后移动。
有没有办法抑制焦点事件,或者在焦点丢失时停止滚动条移动?
答案 0 :(得分:4)
我敢打赌,每当JTextArea
的内容通过setText()
或append()
更改时,有人会构建一个向上滚动并显示文本开头的功能。
还有另一个(Window
,Focus
,Document
或PropertyChange
)Listener
(可能会保存)并且当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);
}
}