我遇到一个奇怪的问题。
方案是我需要将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();
}
}
});
答案 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();
}
}
});