当前位置: 首页 > 面试题库 >

用java写Unicode(Sindhi)的keyListener实现的问题

桂鑫鹏
2023-03-14
问题内容

我想以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字符aunicode字符Sindhi.ALIF。如何只获取unicode手写的字符jTextField


问题答案:

无论您当前遇到什么问题,都不应在JTextField中使用KeyListener。请改用DocumentListener或DocumentFilter。给定您的代码,我猜测您需要的是DocumentFilter,因为您希望在输入JTextField并在显示之前更改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);
   }
}


 类似资料:
  • 我正在尝试实现一个简单的keylistener,用左键箭头绘制椭圆形移动的图形。在使用系统进行测试后,椭圆形不会移动,甚至不会读取按键。出来普林顿。任何帮助都将不胜感激。

  • 本文向大家介绍浅谈Java中Unicode的编码和实现,包括了浅谈Java中Unicode的编码和实现的使用技巧和注意事项,需要的朋友参考一下 Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次。 编码方式 字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“”也是一个字符。字符集是字符的集合。编码字符集是一个字符

  • 我在一个java应用程序上工作。我想在箭头键上实现一个KeyListener。我有一个扩展JFrame并实现ActionListener的类

  • 本文向大家介绍Java实现TopK问题的方法,包括了Java实现TopK问题的方法的使用技巧和注意事项,需要的朋友参考一下 面试中会经常遇到手撕代码的情况,而求TopK的是经常遇到的题目。下面我就用Java来实现。主要通过两种方法实现,快排思想以及堆排序的思想,两者的复杂度为O(NlogK)。 基于快排的TopK实现: 其实整个代码和快排一样,就是多了一个下标位置的判断,if (K - 1 ==

  • 本文向大家介绍C#实现Json转Unicode的方法,包括了C#实现Json转Unicode的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现Json转Unicode的方法。分享给大家供大家参考之用。具体方法如下: 本文实例主要实现输入为带有json格式的文本,输出正常文本的功能。 具体代码如下: 希望本文所述对大家的C#程序设计有所帮助