gpt4 book ai didi

java - 如何将 JTextField 限制为 x 个字符

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:06 24 4
gpt4 key购买 nike

我必须限制 JTextField 中的字符数。我使用以下代码来执行此操作,但问题是我正在使用虚拟键盘将数据提供给 JTextField。所以偏移量一直设置为0。当我输入超过指定数量的字符时,它会重置该字段并从头开始执行。例如,如果我的限制是 3 个字符,并且我正在输入 xyz0,我的有限文本框会将字符读取到 z,然后清除该字段并再次重新启动。所以我在字段中留下了 0。代码如下。

  public class JTextFieldLimit extends PlainDocument {
private int limit;
public JTextFieldLimit(int limit) {
super();
this.limit = limit;
}
@Override
public void insertString( int offset, String str, AttributeSet attr ) throws BadLocationException {
if (str == null) return;
System.out.println("from document helper getLength():"+getLength());
System.out.println("from document helper str.length():"+str.length());
System.out.println("from document helper str:"+str);
System.out.println("from document helper attr:"+attr);
System.out.println("from document helper offset:"+offset);
if ((getLength() + str.length()) <= limit) {
super.insertString(offset, str, attr);
}
}
}

最佳答案

您应该根据 this tutorial 使用 DocumentFilter .例如:

import javax.swing.*;
import javax.swing.text.*;

public class JTextFieldLimit2 extends JPanel{
JTextField textfield = new JTextField(5);

public JTextFieldLimit2() {
PlainDocument doc = (PlainDocument) textfield.getDocument();
doc.setDocumentFilter(new TextLengthDocFilter(3));

add(textfield);
}

private class TextLengthDocFilter extends DocumentFilter {
private int maxTextLength;

public TextLengthDocFilter(int maxTextLength) {
this.maxTextLength = maxTextLength;
}

private boolean verifyText(String text) {
return text.length() <= maxTextLength;
}

@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {

Document doc = fb.getDocument();
String oldText = doc.getText(0, doc.getLength());
StringBuilder sb = new StringBuilder(oldText);
sb.insert(offset, string);

if (verifyText(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 doc = fb.getDocument();
String oldText = doc.getText(0, doc.getLength());
StringBuilder sb = new StringBuilder(oldText);

sb.replace(offset, offset + length, text);
if (verifyText(sb.toString())) {
super.replace(fb, offset, length, text, attrs);
}
}

@Override
public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
Document doc = fb.getDocument();
String oldText = doc.getText(0, doc.getLength());
StringBuilder sb = new StringBuilder(oldText);

sb.replace(offset, offset + length, "");

if (verifyText(sb.toString())) {
super.remove(fb, offset, length);
}
}
}

private static void createAndShowUI() {
JFrame frame = new JFrame("JTextFieldLimit2");
frame.getContentPane().add(new JTextFieldLimit2());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}

关于java - 如何将 JTextField 限制为 x 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6172267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com