有问题。摆动界面。它有几个 jtexfield 形状。以下是关于表格的内容:
portTextField.setDocument(new PortDocument()); //устанавливаем ограничение на ввод в поле
private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String chars = "0123456789";
if (chars.contains(str)) {
if (getLength() < 5) { //порт не более 5 символов (0-65535)
super.insertString(offs, str, a);
}
}
}
}
在这里,当尝试做
portTextField.setText(String.valueOf(port));
运行后值不会出现在字段中。尽管传输了数字,但在本文档中,输入是完全允许的。问题。如何限制字段只能输入数字且长度不能超过5,同时又能通过代码向该字段插入值?
下面是完整的代码:
public SettingFrame(String host, int port, int start, int end) /*throws HeadlessException*/ { //конструктор окна со считанными параметрами
jFrame = this; //устанавливаем соответсвие для удобства
hostTextField.setText(host); //устанавливаем значение хоста
portTextField.setText(String.valueOf(port)); //устанавливаем значение порта
if (start ==0 && end == 0) { //если режим ND не активирован
availableDB.setSelected(false);
startNDTextField.setEnabled(false);
endNDTextField.setEnabled(false);
}else { //если режим ND активирован
availableDB.setSelected(true);
startNDTextField.setEnabled(true);
endNDTextField.setEnabled(true);
startNDTextField.setText(String.valueOf(start));
endNDTextField.setText(String.valueOf(end));
}
init(); //инициируем
private void init() { //инициация. Общая для обоих конструкторов
jFrame.add(rootPanel); //добавляем к фрейму панель
startNDTextField.setDocument(new NDDocument()); //устанавливаем ограничение на ввод в поле
endNDTextField.setDocument(new NDDocument()); //устанавливаем ограничение на ввод в поле
portTextField.setDocument(new PortDocument()); //устанавливаем ограничение на ввод в поле
this.pack(); //устанавливаем размеры
this.setLocationRelativeTo(null); //перемещаем окно в центр рабочего стола
this.setResizable(false); //запрещаем изменять размер окна
this.setVisible(true); //отображаем окно
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //устанавливаем функцию кнопки закрытия - выход из программы
...
最小足够的自我复制方法是:
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class Test {
public static void main(String[] args) {
JTextField jTextField = new JTextField();
jTextField.setText("12");
System.out.println(jTextField.getText().length());
jTextField.setDocument(new PortDocument());
System.out.println(jTextField.getText().length());
}
private static class PortDocument extends PlainDocument { //класс для ограничения длинны ввода для порта
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String chars = "0123456789";
if (chars.contains(str)) {
if (getLength() < 5) { //порт не более 5 символов (0-65535)
super.insertString(offs, str, a);
}
}
}
}
}
在设置setDocument之后设置值。因为setDocument抛出了旧值。
在您的情况下,调用
portTextField.setText(String.valueOf(port))
应该在 之后init()
。该值必须在设置文档后设置。
找到了解决方案。文档格式如下:
现在检查并正确设置