如何在JTextField中设置不同的限制以显示输入提示和输入

时间:2016-12-26 03:11:05

标签: java swing jtextfield focuslistener

我想制作一个自定义的JTextField,我的要求是:

  1. 在文本字段中显示提示。
  2. 只需要有限数量的字符。
  3. 这两项要求都有效。但问题是如果我将限制设置为6,那么它将输入长度设置为6.我需要设置一个额外的限制。

    喜欢,输入提示限制:20,数字输入限制:6 示例:输入提示:在此处输入数字,输入:666666(最多6位数)。

    以下是这两个类。

      

    CustomTextField.java

    public class CustomTextField extends JTextField implements KeyListener, FocusListener{
        private static final long serialVersionUID = 1L;
    
        private final int CHAR_LIMIT = 6;
        private String hint = null;
        private boolean showingHint;
    
        public CustomTextField(String hint) {
            super(hint);
            this.hint = hint;
            this.showingHint = true;
            this.setDocument(new CustomJTextFieldCharLimit(CHAR_LIMIT));
            super.addFocusListener(this);
            this.addKeyListener(this);
        }
    
        @Override
        public void keyPressed(KeyEvent arg0) {
    
        }
    
        @Override
        public void keyReleased(KeyEvent arg0) {
    
        }
    
        @Override
        public void keyTyped(KeyEvent event) {
            char c = event.getKeyChar();
    
            if (!(Character.isDigit(c) || c == KeyEvent.VK_BACK_SPACE || c== KeyEvent.VK_DELETE)) {
                event.consume();
            }
        }
    
        @Override
        public void focusGained(FocusEvent e) {
            if(this.getText().isEmpty()) {
            super.setText("");
            showingHint = false;
            }
        }
        @Override
        public void focusLost(FocusEvent e) {
            if(this.getText().isEmpty()) {
              super.setText(hint);
              showingHint = true;
            }
        }
    
        @Override
        public String getText() {
            return showingHint ? "" : super.getText();
        }
    }
    
      

    CustomJTextFieldCharLimit.java

    public class CustomJTextFieldCharLimit extends PlainDocument{
        private int limit;
    
        public CustomJTextFieldCharLimit(int limit) {
            this.limit = limit;
        }
    
        public void insertString(int offset, String string, AttributeSet set) throws BadLocationException {
            if (string == null) {
                return ;
            }else if ((getLength() + string.length()) <= limit) {
                super.insertString(offset, string, set);
            }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

  

好的,我会在几分钟内检查DocumentFilter

您还没有更改过代码? DocumentFilter是首选方法,因为它是可重用的。您可以将它添加到任何Document,以便它适用于JTextField,JTextArea,JTextPane。

  

这两项要求都有效。但问题是如果我将限制设置为6,那么它将输入长度设置为6.我需要设置一个额外的限制。

您需要使用不同的方法。例如,您可以使用Text Prompt类。提示与实际文本无关,因此长度可以不同。

答案 1 :(得分:0)

尝试覆盖paintComponent(Graphics graphics)课程的CustomTextField方法。这将帮助您在没有输入时重新绘制文本字段。

以下是一个示例实现:

只需在CustomTextField.java文件中添加此代码块即可。

@Override
protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);

    if (hint.isEmpty() || getText().isEmpty() == false) {
        return;
    }

    final Graphics2D g = (Graphics2D) graphics;
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(getDisabledTextColor());
    g.drawString(hint, getInsets().left, graphics.getFontMetrics().getMaxAscent() + getInsets().top);
}

希望这有帮助!