Почему этот набор кода все еще позволяет мне ввести букву n в jtextbox? [Дубликат]

Я нашел эту страницу после выполнения некоторых упражнений с образцами и с тем же самым загадкой.

============== Я перешел от этого кода в качестве примера ===============

public static void main(String[] args) throws IOException {

    Map wordMap = new HashMap();
    if (args.length > 0) {
        for (int i = 0; i < args.length; i++) {
            countWord(wordMap, args[i]);
        }
    } else {
        getWordFrequency(System.in, wordMap);
    }
    for (Iterator i = wordMap.entrySet().iterator(); i.hasNext();) {
        Map.Entry entry = (Map.Entry) i.next();
        System.out.println(entry.getKey() + " :\t" + entry.getValue());
    }

====================== Этот код ========================

public static void main(String[] args) throws IOException {
    // replace with TreeMap to get them sorted by name
    Map<String, Integer> wordMap = new HashMap<String, Integer>();
    if (args.length > 0) {
        for (int i = 0; i < args.length; i++) {
            countWord(wordMap, args[i]);
        }
    } else {
        getWordFrequency(System.in, wordMap);
    }
    for (Iterator<Entry<String, Integer>> i = wordMap.entrySet().iterator(); i.hasNext();) {
        Entry<String, Integer> entry =   i.next();
        System.out.println(entry.getKey() + " :\t" + entry.getValue());
    }

}

================ ================================================== =============

Это может быть безопаснее, но потребовалось 4 часа, чтобы одурачить философию ...

1
задан Arshad Ali 19 November 2013 в 14:42
поделиться

2 ответа

Независимо от вашей текущей проблемы, вы не должны использовать 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);
   }
}
4
ответ дан Hovercraft Full Of Eels 21 August 2018 в 20:47
поделиться
  • 1
    хорошо, что работает для меня, спасибо большое :-) – Arshad Ali 28 September 2013 в 06:55
  • 2
    но как сравнивать и заменять других персонажей? – Arshad Ali 28 September 2013 в 07:04
  • 3
    @ArshadAliSoomro: вы пишете код для этого. Стреляйте, я показал два разных способа сделать это в приведенных выше примерах кода! Ознакомьтесь с двумя различными реализациями метода filterText(...). – Hovercraft Full Of Eels 28 September 2013 в 07:07
  • 4
    есть проблема с этим подходом, он не различает строчные буквы и буквы верхнего регистра, например, если I if (c >= 'A' && c <= 'Z') { char newChar = (char) (c - 'A' + '\u0622'); sb.append(newChar); }, но он не записывает мои желаемые \u0622 и вместо этого записывает ALIPH. PLZ помощь ... – Arshad Ali 19 November 2013 в 14:40

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

К моменту, когда KeyListener возвращает событие, символ уже добавляется в поле.

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

2
ответ дан MadProgrammer 21 August 2018 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: