我想制作一个自定义的JTextField,我的要求是:
这两项要求都有效。但问题是如果我将限制设置为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);
}
}
}
答案 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);
}
希望这有帮助!