issue with implementation of keyListener for writting unicode (Sindhi) in java

前端 未结 2 872
再見小時候
再見小時候 2021-01-23 09:03

I want to use unicode through the implementation of keyListener on jTextField in this way :

textField.addKeyListener(new KeyListener() {

        @O         


        
相关标签:
2条回答
  • 2021-01-23 09:22

    Use a DocumentFilter.

    By the time the KeyListener recives the event, the character has already being added to the field.

    Also KeyListener won't deal with the user pasting content into the field

    0 讨论(0)
  • 2021-01-23 09:27

    Regardless of your current problem, you shouldn't be using a KeyListener in a JTextField. Use a DocumentListener or DocumentFilter instead. Given your code, I'm guessing that a DocumentFilter is what you need, since you wish to change the text of the JTextField as it is being entered and before it is being displayed.

    e.g.,

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

    Or looked at in another way...

    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);
       }
    }
    
    0 讨论(0)
提交回复
热议问题