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

How to set different Limit in JTextField for showing Input Hint and Input

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

  1. 在文本字段中显示提示。
  2. 字符数有限。

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

赞,输入提示限制:20,数字输入限制:6 例子:输入提示:在这里输入一个数字,输入:666666(最多6位)。

这两个 class。

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);
        }
    }
}

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

这是一个示例实现:

只需将此代码块添加到您的 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);
}

希望对您有所帮助!

Okay, I'll check DocumentFilter in few min

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

Both the requirements are working. But the problem is that if I set the limit to 6, then it sets the input length to 6. I need to set an additional limit.

您需要使用不同的方法。例如你可以使用Text Promptclass。提示独立于实际文本,因此长度可能不同。