如何让一个JTextField只能输入一个字符啊?

解决方案 »

  1.   

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument; 
    public class Test extends JPanel {    public Test() {
         JTextField jTextField1 = new JTextField(10); 
         jTextField1.setDocument(new MyDocument(1)); 
         
            add(jTextField1);
            
        }    public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.getContentPane().add(new Test());
           
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 500);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
        
        class MyDocument extends PlainDocument {
         int maxLength = 1;     public MyDocument(int newMaxLength) {
         super();
         maxLength = newMaxLength;
         }     public MyDocument() {
         this(10);
         }     //重载父类的insertString函数 
         public void insertString(int offset, String str, AttributeSet a)
         throws BadLocationException {
         if (getLength() + str.length() > maxLength) { 
         return;
         } else {
         super.insertString(offset, str, a);     }
         }    }}
    试下
      

  2.   

    也可以用键盘监听器的方法 import java.awt.event.KeyEvent;
        import java.awt.event.KeyListener;
        import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.PlainDocument;  
    public class T extends JPanel implements KeyListener {   private JTextField jTextField1; public T() {
      jTextField1 = new JTextField(10);  
      jTextField1.setDocument(new MyDocument(1));  
      jTextField1.addKeyListener(this);
      add(jTextField1); 
      }
      
      public static void main(String[] args) {
      JFrame frame = new JFrame();
      frame.getContentPane().add(new T());
        
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(400, 500);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
      }
        
      class MyDocument extends PlainDocument {
      int maxLength = 1;   public MyDocument(int newMaxLength) {
      super();
      maxLength = newMaxLength;
      }   public MyDocument() {
      this(10);
      }
      } @Override
    public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
        if(this.jTextField1.getDocument().getLength()>1){
         try {
    this.jTextField1.getDocument().remove(1, this.jTextField1.getDocument().getLength()-1);
    } catch (BadLocationException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
        }
    } @Override
    public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

    } @Override
    public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub

    } }
      

  3.   

    但是,我想能不能用CaretListener来完成啊
      

  4.   


    用CaretListener可以检测到光标的位置但是在CaretListener的caretUpdate方法中因为没有writelock无法更改textfield的值