2013-09-28 2 views
1

Я хочу использовать юникод путем осуществления KeyListener на jTextField таким образом:проблема с реализацией KeyListener для Writting юникода (Синд) в Java

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

ответ

4

Независимо от вашей текущей проблемы, вы не должны использовать KeyListener в JTextField. Вместо этого используйте 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); 
    } 
} 
+0

ОК, что работает для меня Большое спасибо :-) –

+0

но как сравнивать и заменить другие символы? –

+0

@ArshadAliSoomro: вы пишете код для этого. Стреляйте, я показал два разных способа сделать это в приведенных выше примерах кода! Ознакомьтесь с двумя различными реализациями метода 'filterText (...)'. –

2

Используйте DocumentFilter.

К моменту появления события KeyListener символ уже добавляется в поле.

Также KeyListener не будет иметь дело с пользовательского контента наклеивать в поле

Смежные вопросы