使用KeyEvent(KeyPressed,KeyTyped,...)将char附加到JTextArea

时间:2014-03-01 21:37:26

标签: java swing jtextarea keylistener keyevent

当我按下一个特定按钮后尝试将一个字符串或字符串附加到jtextarea时,会发生奇怪的事情,例如我想在jtextarea中用户按'{'之后附加'}',通过以下代码,最终jTextArea中的字符串将是“} {”而不是“{}”

private void keyPressedEvent(java.awt.event.KeyEvent evt)
{
    if(evt.getkeychar() == '{' )
    {
        JtextArea1.append("}");
    }
}

1 个答案:

答案 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));
   }
}