当我按下一个特定按钮后尝试将一个字符串或字符串附加到jtextarea时,会发生奇怪的事情,例如我想在jtextarea中用户按'{'之后附加'}',通过以下代码,最终jTextArea中的字符串将是“} {”而不是“{}”
private void keyPressedEvent(java.awt.event.KeyEvent evt)
{
if(evt.getkeychar() == '{' )
{
JtextArea1.append("}");
}
}
答案 0 :(得分:4)
您几乎不应该在JTextArea或其他JTextComponent上使用KeyListener。为此,我使用DocumentFilter,它允许您在用户的输入发送给它之前更新Document。
例如,
import javax.swing.*;
import javax.swing.text.*;
public class DocFilterEg {
public static void main(String[] args) {
JTextArea textArea = new JTextArea(10, 20);
PlainDocument doc = (PlainDocument) textArea.getDocument();
doc.setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String text,
AttributeSet attr) throws BadLocationException {
text = checkTextForParenthesis(text);
super.insertString(fb, offset, text, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
text = checkTextForParenthesis(text);
super.replace(fb, offset, length, text, attrs);
}
private String checkTextForParenthesis(String text) {
if (text.contains("{") && !text.contains("}")) {
int index = text.indexOf("{") + 1;
text = text.substring(0, index) + "}" + text.substring(index);
}
return text;
}
});
JOptionPane.showMessageDialog(null, new JScrollPane(textArea));
}
}