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
) Listener
当 JFrame
停用时(可能保存并)刷新 JTextArea
的内容以不丢失任何用户编辑。
这两个功能不能很好地结合在一起...
我正在开发旧版 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
) Listener
当 JFrame
停用时(可能保存并)刷新 JTextArea
的内容以不丢失任何用户编辑。
这两个功能不能很好地结合在一起...