Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 焦点丢失时,JScrollPane将丢失滚动位置_Java_Swing_Jscrollpane - Fatal编程技术网

Java 焦点丢失时,JScrollPane将丢失滚动位置

Java 焦点丢失时,JScrollPane将丢失滚动位置,java,swing,jscrollpane,Java,Swing,Jscrollpane,我正在开发一个遗留的swing应用程序 此应用程序在JScrollPane中有一个定制的JTextArea 我遇到的问题是,当应用程序失去焦点(例如,另一个应用程序的Alt Tabs)时,滚动条和插入符号位置会返回顶部。我想发生的是,当焦点丢失时,插入符号位置和滚动值保持不变 我目前有一个焦点监听器,它在焦点丢失时存储插入符号位置和滚动条值,在获得焦点时再次设置。这很有效。然而,它看起来有点吓人,因为当焦点丢失时滚动条仍然会跳到顶部,而当获得焦点时滚动条会向后移动 有没有办法抑制焦点事件,或者在

我正在开发一个遗留的swing应用程序

此应用程序在
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
the
setText()的子类之一中
方法包括对
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);
    }
}