Java 焦点丢失时,JScrollPane将丢失滚动位置
我正在开发一个遗留的swing应用程序 此应用程序在Java 焦点丢失时,JScrollPane将丢失滚动位置,java,swing,jscrollpane,Java,Swing,Jscrollpane,我正在开发一个遗留的swing应用程序 此应用程序在JScrollPane中有一个定制的JTextArea 我遇到的问题是,当应用程序失去焦点(例如,另一个应用程序的Alt Tabs)时,滚动条和插入符号位置会返回顶部。我想发生的是,当焦点丢失时,插入符号位置和滚动值保持不变 我目前有一个焦点监听器,它在焦点丢失时存储插入符号位置和滚动条值,在获得焦点时再次设置。这很有效。然而,它看起来有点吓人,因为当焦点丢失时滚动条仍然会跳到顶部,而当获得焦点时滚动条会向后移动 有没有办法抑制焦点事件,或者在
JScrollPane
中有一个定制的JTextArea
我遇到的问题是,当应用程序失去焦点(例如,另一个应用程序的Alt Tabs)时,滚动条和插入符号位置会返回顶部。我想发生的是,当焦点丢失时,插入符号位置和滚动值保持不变
我目前有一个焦点监听器,它在焦点丢失时存储插入符号位置和滚动条值,在获得焦点时再次设置。这很有效。然而,它看起来有点吓人,因为当焦点丢失时滚动条仍然会跳到顶部,而当获得焦点时滚动条会向后移动
有没有办法抑制焦点事件,或者在焦点丢失时停止滚动条的移动?鉴于此简单代码中没有出现这种情况,我的建议是:-更改代码中首先导致问题的内容
import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类滚动位置{
私有JComponent ui=null;
滚动位置(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新JPanel(新边界布局(4,4));
ui.新订单(新的空订单(4,4,4,4));
JTextArea ta=新的JTextArea(4,20);
添加(新的JScrollPane(ta));
字符串eol=System.getProperty(“line.separator”);
对于(inti=0;i,如果在这个更简单的代码中没有出现,我的建议是:-更改代码中首先导致问题的内容
import java.awt.*;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类滚动位置{
私有JComponent ui=null;
滚动位置(){
initUI();
}
public void initUI(){
如果(ui!=null)返回;
ui=新JPanel(新边界布局(4,4));
ui.新订单(新的空订单(4,4,4,4));
JTextArea ta=新的JTextArea(4,20);
添加(新的JScrollPane(ta));
字符串eol=System.getProperty(“line.separator”);
对于(int i=0;i我打赌有人会构建一个功能,每当JTextArea
的内容通过setText()
或append()
更改时,向上滚动并显示文本的开头
和还有另一个(窗口
,焦点
,文档
或属性更改
)侦听器
,当JFrame
被禁用时,它(可能保存并)刷新JTextArea
的内容,以不丢失任何用户编辑
这两个功能不能很好地结合在一起……我打赌有人构建了一个功能,每次JTextArea
的内容通过setText()
或append()
更改时,都会向上滚动并显示文本的开头
和还有另一个(窗口
,焦点
,文档
或属性更改
)侦听器
,当JFrame
被禁用时,它(可能保存并)刷新JTextArea
的内容,以不丢失任何用户编辑
这两个功能不能很好地结合在一起…要更快地获得更好的帮助,请发布一个(最小完整可验证示例)或(简短、自包含、正确示例)。要更快地获得更好的帮助,请发布一个(最小完整可验证示例)或(简短、自包含、正确示例)。您好,Andrew,恕我直言,回答当代码库有数百万行代码时,“修复坏掉的东西”(释义)没有多大帮助。但我确实很欣赏代码片段,因为它节省了我编写类似于将我的公司专有类替换成的东西的时间。因此,谢谢:)嗨,安德鲁,恕我直言,回答“修复坏掉的东西”(释义)当代码库有数百万行代码时,这并没有多大帮助。但我确实很欣赏代码片段,因为它省去了我编写类似于将我的公司专有类替换为的东西。因此,谢谢:)这确实是个问题。在JTextArea
thesetText()的子类之一中
方法包括对setCaretPosition(0)
的调用。这是由一个FocusListener
触发的,它正在侦听更新以将更改传播到工作流模型。这确实是个问题。在JTextArea
的一个子类中,setText()
方法包括对setCaretPosition(0)
的调用。这是由一个FocusListener
触发的,它正在侦听更新以将更改传播到工作流模型。
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);
}
}