Java Textfield设置char长度

时间:2014-11-05 20:07:53

标签: java swing textfield

它出现在java中没有办法限制长度。我查看了其他示例,人们创建了单独的类等。

我很好奇我们是否可以在不使用其他类的情况下使用action事件来执行此操作。

这是我到目前为止所拥有的。

   txtTest.addKeyListener(new KeyAdapter()
   public void keyPressed(KeyEvent e)
        {
            int MAX_LEN = 5;
            char c = e.getKeyChar();
            int len = txtTest.getText().length();
            if(len < MAX_LEN)
            {
                return;
            }else
            {
                Logging.info("TOOO LONG");
            }

        }
    });

所以,如果我输入的文字超过5个字符,我就到了这一点。有没有我可以触发的事件,所以如果他们输入6个字符,它会被删除吗?例如,模仿退格键还是删除键?

2 个答案:

答案 0 :(得分:2)

很抱歉,这是一个非常脆弱的解决方案,您应该尽可能避免在文本组件上使用KeyListener。例如,当用户尝试复制和粘贴文本时会发生什么?我担心在那种情况下,你的代码会失败。还有其他更深层次的原因可以避免使用KeyListeners,但最重要的是你可以使用DocumentFilter。

例如

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;


@SuppressWarnings("serial")
public class TextTestGui extends JPanel  {
   private JTextField limitedField = new JTextField(10);

   public TextTestGui() {
      add(limitedField);
      PlainDocument doc = (PlainDocument) limitedField.getDocument();
      doc.setDocumentFilter(new MyDocFilter(5));;
   }

   private class MyDocFilter extends DocumentFilter {

      private int limit;

      public MyDocFilter(int limit) {
         this.limit = limit;
      }

      @Override
      public void insertString(FilterBypass fb, int offset, String string,
            AttributeSet attr) throws BadLocationException {
         Document innerDoc = fb.getDocument();
         StringBuilder sb = new StringBuilder(innerDoc.getText(0, innerDoc.getLength()));
         sb.insert(offset, string);
         if (textOK(sb.toString())) {
            super.insertString(fb, offset, string, attr);
         }
      }

      @Override
      public void replace(FilterBypass fb, int offset, int length, String text,
            AttributeSet attrs) throws BadLocationException {
         Document innerDoc = fb.getDocument();
         StringBuilder sb = new StringBuilder(innerDoc.getText(0, innerDoc.getLength()));
         int start = offset; 
         int end = offset + length;
         sb.replace(start, end, text);
         if (textOK(sb.toString())) {
            super.replace(fb, offset, length, text, attrs);
         }
      }

      @Override
      public void remove(FilterBypass fb, int offset, int length)
            throws BadLocationException {
         super.remove(fb, offset, length);
      }

      private boolean textOK(String text) {
         if (text.length() <= limit) {
            return true;
         }
         return false;
      }
   }

   private static void createAndShowGui() {
      TextTestGui mainPanel = new TextTestGui();

      JFrame frame = new JFrame("TextTestGui");
      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();
         }
      });
   }
}

答案 1 :(得分:-1)

这是keyListener的一种方式:

txtTest.addKeyListener(new KeyAdapter(){
    public void keyPressed(KeyEvent e)
    {
        char[] letters = txtTest.getText().toCharArray();
        if(txtTest.getText().length() < 5)
        {
            return;
        }else
        {
            txtTest.setText(""+letters[0]+letters[1]+letters[2]+letters[3]+letters[4]);
        }
    }
});

但是你可以用while循环来完成它:

public void Update(){
    while(true){
        if(txtTest.getText() != null){
            if(!(txtTest.getText().length() < 5))
            {
                char[] letters = txtTest.getText().toCharArray();
                txtTest.setText(""+letters[0]+letters[1]+letters[2]+letters[3]+letters[4]);
            }
        }
    }
}

不幸的是,它处理起来有点太快,所以你需要调整更新速度,这会变得很复杂。