在java中写入unicode(Sindhi)的keyListener的实现问题

时间:2013-09-28 04:44:07

标签: java swing unicode keylistener

我想通过这种方式在jTextField上实现keyListener来使用unicode:

textField.addKeyListener(new KeyListener() {

        @Override
        public void keyTyped(KeyEvent evt) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyPressed(KeyEvent evt) {
            // TODO Auto-generated method stub
            char var = evt.getKeyChar();
            if(var == 'a'){
                String values = urlTextField.getText() + Sindhi.ALIF;
                urlTextField.setText(values);
            }
        }
    });

但它会将English字符a写为unicode个字符Sindhi.ALIF。如何仅获取unicode

中写的jTextField字符

2 个答案:

答案 0 :(得分:4)

无论您当前的问题是什么,都不应该在JTextField中使用KeyListener。请改用DocumentListener或DocumentFilter。鉴于您的代码,我猜测DocumentFilter是您所需要的,因为您希望在输入时以及在显示之前更改JTextField的文本。

如,

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;

public class SwapAForAleph {
   // No idea of the correct unicode for this!!!
   public static final char SINDHI_ALIF = '\u0623'; 

   public static void main(String[] args) {
      final JTextField textField = new JTextField(10);
      textField.setFont(textField.getFont().deriveFont(32f));
      PlainDocument doc = (PlainDocument) textField.getDocument();
      doc.setDocumentFilter(new DocumentFilter() {
         @Override
         public void insertString(FilterBypass fb, int offset, String text,
               AttributeSet attr) throws BadLocationException {
            text = filterText(text);
            super.insertString(fb, offset, text, attr);
         }

         @Override
         public void replace(FilterBypass fb, int offset, int length,
               String text, AttributeSet attrs) throws BadLocationException {
            text = filterText(text);
            super.replace(fb, offset, length, text, attrs);
         }


         private String filterText(String text) {
            return text.replace('a', SINDHI_ALIF);
         }
      });

      JPanel panel = new JPanel();
      panel.add(textField);
      JOptionPane.showMessageDialog(null, panel);
   }
}

或以另一种方式看待......

import java.awt.ComponentOrientation;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;

public class NonEnglishTextField {
   public static final char ALEPH = '\u05D0';

   public static void main(String[] args) {
      final JTextField textField = new JTextField(20);
      textField.setFont(textField.getFont().deriveFont(32f));
      textField.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
      textField.setHorizontalAlignment(SwingConstants.RIGHT);
      PlainDocument doc = (PlainDocument) textField.getDocument();
      doc.setDocumentFilter(new DocumentFilter() {
         @Override
         public void insertString(FilterBypass fb, int offset, String text,
               AttributeSet attr) throws BadLocationException {
            text = filterText(text);
            super.insertString(fb, offset, text, attr);
         }

         @Override
         public void replace(FilterBypass fb, int offset, int length,
               String text, AttributeSet attrs) throws BadLocationException {
            text = filterText(text);
            super.replace(fb, offset, length, text, attrs);
         }


         private String filterText(String text) {
            StringBuilder sb = new StringBuilder();
            for (char c : text.toLowerCase().toCharArray()) {
               if (c >= 'a' && c <= 'z') {
                  char newChar = (char) (c - 'a' + ALEPH);
                  sb.append(newChar);
               } else {
                  sb.append(c);
               }
            }
            return sb.toString();
         }
      });

      JPanel panel = new JPanel();
      panel.add(textField);
      JOptionPane.showMessageDialog(null, panel);
   }
}

答案 1 :(得分:2)

使用DocumentFilter。

当KeyListener重新播放该事件时,该字符已添加到该字段中。

KeyListener也不会处理将内容粘贴到字段中的用户