如何在 JTextField 中设置不同的限制以显示输入提示和输入
How to set different Limit in JTextField for showing Input Hint and Input
我想做一个自定义的JTextField,我的要求是:
- 在文本字段中显示提示。
- 字符数有限。
这两个要求都有效。但问题是,如果我将限制设置为 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。提示独立于实际文本,因此长度可能不同。
我想做一个自定义的JTextField,我的要求是:
- 在文本字段中显示提示。
- 字符数有限。
这两个要求都有效。但问题是,如果我将限制设置为 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。提示独立于实际文本,因此长度可能不同。