【问题标题】:how can i type only characters in jTextField?如何在 jTextField 中只输入字符?
【发布时间】:2014-07-12 03:41:16
【问题描述】:

我只需要在 java 的文本字段区域中键入字符。我通过更改为各种类型尝试了以下代码。

char a= evt.getKeyChar();
    if(!(a>='0'&&a<='9')){
    evt.consume();
    }

【问题讨论】:

    标签: java swing


    【解决方案1】:

    尝试使用DocumentFilter,并将其附加到JTextFieldDocument

    这是一个相同的小例子,寻求帮助:

    FilterCharacters.java

    package to.uk.gagandeepbali.examples;
    
    import javax.swing.*;
    import javax.swing.text.AbstractDocument;
    import java.awt.*;
    
    /**
     * Created by Gagandeep Bali on 7/12/2014.
     */
    public class FilterCharacters {
    
        private void displayGUI() {
            JFrame frame = new JFrame("Filtering Text Example");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
            JPanel contentPane = new JPanel();
            JTextField tField = new JTextField(10);
            ((AbstractDocument)tField.getDocument()).setDocumentFilter(new MyDocumentFilter());
            contentPane.add(tField);
    
            frame.setContentPane(contentPane);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    new FilterCharacters().displayGUI();
                }
            };
            EventQueue.invokeLater(runnable);
        }
    }
    

    MyDocumentFilter.java

    package to.uk.gagandeepbali.examples;
    
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    import java.awt.*;
    
    /**
     * Created by Gagandeep Bali on 7/12/2014.
     */
    public class MyDocumentFilter extends DocumentFilter {
        @Override
        public void insertString(DocumentFilter.FilterBypass fp, int offset,
                                    String stringToFilter, AttributeSet aset)
                                        throws BadLocationException {
            int len = stringToFilter.length();
            if (Character.isLetter(stringToFilter.charAt(len - 1)))
                super.insertString(fp, offset, stringToFilter, aset);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    
        @Override
        public void replace(DocumentFilter.FilterBypass fp, int offset, int length,
                                            String stringToFilter, AttributeSet aset)
                                                        throws BadLocationException {
            int len = stringToFilter.length();
            if (Character.isLetter(stringToFilter.charAt(len - 1)))
                super.replace(fp, offset, length, stringToFilter, aset);
            else
                Toolkit.getDefaultToolkit().beep();
        }
    }
    

    【讨论】:

      【解决方案2】:

      看起来您在 JTextField 中使用了 KeyListener,如果是这样,请不要这样做,因为您会弄乱 JTextField 函数。而是使用 JFormattedTextField 或给文本字段的 Document 一个 DocumentListener。


      编辑
      例如:

      import java.text.Format;
      import java.text.NumberFormat;
      
      import javax.swing.*;
      import javax.swing.text.AttributeSet;
      import javax.swing.text.BadLocationException;
      import javax.swing.text.DocumentFilter;
      import javax.swing.text.PlainDocument;
      
      public class DigitOnlyFieldTest {
      
         private static void createAndShowGui() {
            Format digitFormat = NumberFormat.getIntegerInstance();
            JFormattedTextField digitField = new JFormattedTextField(digitFormat);
            digitField.setColumns(10);
      
            JTextField textField = new JTextField(10);
            ((PlainDocument) textField.getDocument()).setDocumentFilter(new DocumentFilter() {
               @Override
               public void insertString(FilterBypass fb, int offset, String text,
                     AttributeSet attr) throws BadLocationException {
                  text = text.replaceAll("\\D", "");
                  super.insertString(fb, offset, text, attr);
               }
      
               @Override
               public void replace(FilterBypass fb, int offset, int length,
                     String text, AttributeSet attrs) throws BadLocationException {
                  text = text.replaceAll("\\D", "");
                  super.replace(fb, offset, length, text, attrs);
               }
            });
      
      
            JPanel mainPanel = new JPanel();
            mainPanel.add(new JLabel("Formatted Text Field: "));
            mainPanel.add(digitField);
            mainPanel.add(new JLabel("Text Field with Doc Filter: "));
            mainPanel.add(textField);
      
            JFrame frame = new JFrame("DigitOnlyFieldTest");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
         }
      
         public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                  createAndShowGui();
               }
            });
         }
      }
      

      现在这将适用于用户文本输入、复制和粘贴以及基于软件的文本输入。

      【讨论】:

        【解决方案3】:

        试试这个例子,它可能对你有帮助

        import java.awt.FlowLayout;
        import java.awt.event.KeyAdapter;
        import java.awt.event.KeyEvent;
        
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JTextField;
        
        public class SwingDemo extends JFrame {
        
            private JTextField textField;
        
            public SwingDemo() {
                super("TextField Filter Example By SuRu");
                setBounds(100, 100, 500, 200);
                setDefaultCloseOperation(EXIT_ON_CLOSE);
        
                setLayout(new FlowLayout());
                getContentPane().add(new JLabel("Accepts Only Digits: "));
        
                textField = new JTextField(40);
                getContentPane().add(textField);
        
                textField.addKeyListener(new KeyAdapter() {
        
                    @Override
                    public void keyTyped(KeyEvent e) {
                        if (!Character.isDigit(e.getKeyChar())) {
                            e.consume();
                        }
                    }
                });
        
            }
        
            public static void main(String[] args) {
                new SwingDemo().setVisible(true);
            }
        
        }
        

        【讨论】:

        • 如果他使用复制粘贴将文本添加到 JTextField?同样,在这种情况下不要使用 KeyListener,因为有更好更健壮的答案。 -1 否决票。
        猜你喜欢
        • 1970-01-01
        • 2012-05-25
        • 2013-08-17
        • 2012-03-17
        • 2011-08-05
        • 1970-01-01
        • 2016-03-26
        • 2020-09-01
        • 2022-11-02
        相关资源
        最近更新 更多