JTextArea在重新设置文本

时间:2015-05-28 15:09:42

标签: scroll replace jtextarea

我遇到一个奇怪的问题。

方案是我需要将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();
        }
    }
});

1 个答案:

答案 0 :(得分:0)

我找到了一种解决方法:在函数mousePressed中设置文本,然后在函数mouseReleased中滚动 我怀疑在组件可以找出滚动维度之前,必须在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();
        }
    }
});