Scroll JTextArea在重新设置文本后不滚动到可见

Scroll JTextArea在重新设置文本后不滚动到可见,scroll,replace,jtextarea,Scroll,Replace,Jtextarea,我遇到了一个奇怪的问题。 场景是我需要用另一个单词替换JTextArea中的关键字。 我有两个按钮,一个是查找关键字,另一个是替换关键字。 对于这两个按钮,我都添加了鼠标侦听器并实现函数mouseClicked。在当前阶段,我可以突出显示找到的关键字并滚动到关键字位置。但是当处理替换按钮时,在重新设置文本后,JTextArea总是向下滚动到底部,但是我想保持替换发生的位置,我该怎么办?下面是我的代码片段,但它不起作用 replaceBtn.addMouseListener(new MouseAd

我遇到了一个奇怪的问题。

场景是我需要用另一个单词替换
JTextArea
中的关键字。

我有两个按钮,一个是查找关键字,另一个是替换关键字。

对于这两个按钮,我都添加了鼠标侦听器并实现函数
mouseClicked
。在当前阶段,我可以突出显示找到的关键字并滚动到关键字位置。但是当处理替换按钮时,在重新设置文本后,
JTextArea
总是向下滚动到底部,但是我想保持替换发生的位置,我该怎么办?下面是我的代码片段,但它不起作用

replaceBtn.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        String keyword = jKeyword.getText();
        if (keyword.length() == 0)
            return;

        String text = jTextArea.getText();
        pos = text.indexOf(keyword, 0);
        if (pos == -1) {
            pos = 0;
            JOptionPane.showMessageDialog(null, "can not find " + keyword);
            return;
        }

        jTextArea.setText(text.replaceFirst(keyword, jReplaceKW.getText()));
        //jTextArea.revalidate();

        //scroll to first keyword occurrence
        try {
            Rectangle rectangle = jTextArea.modelToView(pos);
            jTextArea.scrollRectToVisible(rectangle);
        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }
    }
});

我找到了一个解决方法:在函数
鼠标按下时设置文本,然后在函数
鼠标按下时滚动

我怀疑在组件能够计算出滚动尺寸之前,必须在GUI中表示文本?不确定

replaceBtn.addMouseListener(new MouseAdapter() {

    @Override
    public void mousePressed(MouseEvent e) {
        String keyword = jKeyword.getText();
        if (keyword.length() == 0)
            return;

        String text = jTextArea.getText();
        pos = text.indexOf(keyword, 0);
        if (pos == -1) {
            pos = 0;
            JOptionPane.showMessageDialog(null, "can not find " + keyword);
            return;
        }

        jTextArea.setText(text.replaceFirst(keyword, jReplaceKW.getText()));
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        //scroll to first keyword occurrence
        try {
            Rectangle rectangle = jTextArea.modelToView(pos);
            jTextArea.scrollRectToVisible(rectangle);
        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }
    }
});