JScrollPane如何在以后设置插入符号

时间:2013-11-25 20:20:21

标签: java swing jscrollpane caret

我有一个需要存储当前插入位置的应用程序,然后在滚动窗格上重新创建数据,然后将用户放回到他正在查看的位置。

int scrollIndex = 0;
if(scrollPane != null) {
    scrollIndex = scrollPane.getVerticalScrollBar().getValue();
}

scrollPane = new JScrollPane(newpanel);

scrollPane.getVerticalScrollBar().setValue(scrollIndex);

这不会将插入符号设置为上一个滚动 - 但是在某些其他值上我不明白。

我也寻找过getCaret,但这似乎不存在。

编辑1

这几乎有效:

int scrollIndex = 0;
JViewport vp = null;
if(scrollPane != null) {
    //scrollIndex = scrollPane.getVerticalScrollBar().getValue();
    vp = scrollPane.getViewport();
}

scrollPane = new JScrollPane(newpanel);

//scrollPane.getVerticalScrollBar().setValue(scrollIndex);
scrollPane.setViewport(vp);

“视图”在我正在查看的scrollPoint上保持不变。但滚动条设置回0 - 即使视图很好。如果我像以前一样尝试setValue - 我再次得到错误的观点。

当我做scrollPane.setViewport(vp);我还有其他需要做的事情,滚动条会留在同一个地方吗?

1 个答案:

答案 0 :(得分:0)

方法scrollPane.getVerticalScrollBar().getValue()scrollPane.getVerticalScrollBar().setValue(scrollIndex);工作正常,请尝试使用单JScrollPane

我认为您在创建JScrollPane

的新实例时遇到了问题

而不是scrollPane = new JScrollPane(newpanel);使用

scrollPane.getViewport().setView(newpanel);可帮助您在视口中更改组件以进行滚动,而无需新实例。

观看下一个代码示例:

public class Example extends JFrame {

    private JScrollPane pane;
    private int value;

    public Example() {
        final JTextArea jTextArea = new JTextArea(10, 10);

        final JTextArea jTextArea2 = new JTextArea(10, 10);
        jTextArea2.setText("1\n21\n2\n\n\n\n\n121221\ne\n\nee\ne\n");
        pane = new JScrollPane(jTextArea);
        JButton save = new JButton("save");
        save.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                value = pane.getVerticalScrollBar().getValue();
            }
        });

        JButton load = new JButton("load");
        load.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                pane.getViewport().setView(jTextArea2);
                pane.getVerticalScrollBar().setValue(value);
            }
        });

        getContentPane().add(save,BorderLayout.WEST);
        getContentPane().add(pane,BorderLayout.CENTER);
        getContentPane().add(load,BorderLayout.EAST);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new Example().setVisible(true);
            }
        });
    }
}