Как ограничить JTextFiled, чтобы принимать только числа менее 10, без слов, пробелов и других специальных символов?Как ограничить JTextFiled, чтобы принимать только числа меньше 10?
ответ
Используйте Swing Javabuilders, где вы можете определить свой графический интерфейс в YML (ниже), включая проверку текстового поля.
Вы заявляете в вашем гуе в файле YAML, вот пример для Person.java, называется Person.Yaml:
JFrame(name=frame, title=frame.title, size=packed, defaultCloseOperation=exitOnClose):
- JButton(name=save, text=button.save, onAction=[$validate,save,done])
- JButton(name=cancel, text=button.cancel, onAction=[$confirm,cancel])
- MigLayout: |
[pref] [grow,100] [pref] [grow,100]
"label.firstName" txtFirstName "label.lastName" txtLastName
"label.email" txtEmail+*
>save+*=1,cancel=1
bind:
- txtFirstName.text: person.firstName
- txtLastName.text: person.lastName
- txtEmail.text: person.emailAddress
validate:
- txtFirstName.text: {mandatory: true, label: label.firstName}
- txtLastName.text: {mandatory: true, label: label.lastName}
- txtEmail.text: {mandatory: true, emailAddress: true, label: label.email}
три блока выше следующим образом:
качелей Классов (JFrame, и JButton), а также Layout Manager, с встроенных JLabels (label.firstName
и label.lastName
), которые признаны «этикеткой» части своей декларации и JTextFields (txtLastName
, txtFirstName
и txtEmail
) где Аr e распознаются txt частью их имени.
Связывание данных: привязывает JTextArea.text
к class.fieldName
, так что, когда данные вводятся в JTextField, они отображаются в поля.
Проверка: здесь текст подтвержден. Обратите внимание, что JButton
с именем «Сохранить» в разделе onAction
имеет запись $validate
, которая запускает встроенный метод проверки. Это читает вид проверки в блоке из валидации:
txtFirstName.text: {mandatory: true, label: label.firstName}
который объявляет поле должен быть заполнен в (mandatory: true
) и txtEmail
должны быть заполнены с действительным адресом электронной почты (emailAddress: true
). Ниже приведена дополнительная проверка.
Как только вы объявили графический интерфейс, вы просто запускаете его так, изнутри вашего java-файла.
private BuildResult result;
.....
public methodName(){
.....
result = SwingJavaBuilder.build(this).setVisible(true);
}
Этот метод (build(this)
) ссылается на .yml файл с таким же именем (так что ваш графический интерфейс в person.yml и в паре с Person.java).
Там больше проверки в документации:
validate:
- mandatory.text: {label: Mandatory Field, mandatory: true}
- date.text: {label: Date Field, dateFormat: "yyyy/mm/dd"}
- email.text: {label: E-Mail, email: true}
- minmax.text: {label: Min/Max Length, minLength: 5, maxLength: 10}
- regex.text: {label: Regex, regex: "[a-zA-Z0-9]+"}
- regex2.text: {label: Regex, regex: "[a-zA-Z0-9]+",
regexMessage: "''{0}'' must be a number or letter"}
- long.text: {label: Min/Max Long, minValue: 5, maxValue: 50, mandatory: true}
Таким образом, вы хотели бы использовать последнюю одну long.text
с этой спецификацией:
myValidNumberField{label: Number less than ten, maxValue: 10, mandatory: true}`
Там больше информации о github странице о настройке ваш графический интерфейс выглядит так.
Для тех, кто не может ждать, вот статья, в которой подчеркивается использование: http://java.dzone.com/articles/making-gui-builders-obsolete – Pureferret
Вы пили, пожалуйста, перечитайте ваше сообщение здесь, из моего разума – mKorbel
@mKorbel Я не уверен, что вы говорите, но я добавил больше к ответу. – Pureferret
Попробуйте: -
JTextField textField = new JTextField();
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//do stuff here when enter pressed
String text = textField.getText();
if(text!=null && !text.equals("")){
char c = evt.getKeyChar();
int val=Integer.parseInt(c);
if(val>=48 && val<=57){
if(Integer.parseInt(text)<=10){
//Its valid and allowed
}else{
//Its invalid, show error message here
}
}else{
//Show message only numbers are allowed
return false;
}
}
}
});
Надеется, что это поможет.
«ActrionListener» будет запущен только при нажатии клавиши ввода. Любой из других ответов дает лучшее решение здесь. –
Опять же, DocumentFilter это один из способов решить эту проблему:
import javax.swing.*;
import javax.swing.text.*;
@SuppressWarnings("serial")
public class DocFilterExample extends JPanel{
JTextField textfield = new JTextField(5);
public DocFilterExample() {
PlainDocument doc = (PlainDocument) textfield.getDocument();
doc.setDocumentFilter(new MaxNumberDocFilter(10));
add(textfield);
}
private class MaxNumberDocFilter extends DocumentFilter {
private int maxNumber;
public MaxNumberDocFilter(int maxnumber) {
this.maxNumber = maxnumber;
}
private boolean verifyText(String text) {
if (text.isEmpty()) {
return true; // allow for a blank text field
}
int value = 0;
try {
value = Integer.parseInt(text);
if (value >= 0 && value < maxNumber) {
return true; // if it's a number in range, it passes
}
} catch (NumberFormatException e) {
return false; // if it's not a number, it fails.
}
return false;
}
@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("Eg");
frame.getContentPane().add(new DocFilterExample());
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();
}
});
}
}
- Преимущества:
- не требуется никаких сообщений об ошибках. Вместо этого он просто предотвращает ввод плохого ввода.
- Он отлично подходит для вырезания и вставки.
- Недостатки:
- нет сообщений об ошибках приведены, и поэтому пользователь не будет знать, почему его текст не принимается.
- Это немного длинный и громоздкий.
- Непросто «цепочка» - с помощью нескольких фильтров одновременно, что-то Роб Камик проделал определенную работу.
Легче будет использовать компонент, предназначенный для этого:
JSpinner spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(0, null, 10, 1));
Технически JSpinner
не является производным от JTextField
, он использует один внутренний для редактора части и, таким образом, выглядит как один (плюс у него есть дополнительные кнопки для изменения номера с помощью щелчков мыши).
- 1. Ограничить JTextField, чтобы принимать только набор символов
- 2. Java - ограничить сканер, чтобы принимать только удвоения
- 3. Как ограничить текстовое поле ExtJs, чтобы принимать только числа, используя maskRe. (Должен принимать положительные, отрицательные, целочисленные и десятичные числа.)
- 4. Как ограничить мое поле должно принимать только числа в рельсах?
- 5. ограничивать jtextfield, чтобы принимать только числа?
- 6. Чтобы разрешить входной текст принимать только числа
- 7. Список ограничений, чтобы принимать только целые числа
- 8. Я не могу ограничить мою программу принимать только двоичные числа
- 9. Можно ли ограничить TextCtrl принимать числа только в wxPython?
- 10. Как ограничить общую функцию, чтобы принимать только некоторый тип классов
- 11. cshtml TextBoxFor должен принимать только числа (0-10)
- 12. html5 номер типа, чтобы принимать только положительные целые числа
- 13. Как я могу проверить ввод, чтобы принимать только двоичные числа?
- 14. resultset.next() принимать меньше записей
- 15. Разрешение метода принимать только числа?
- 16. только принимать неотрицательные числа Java
- 17. Ограничить uibDatepicker всплывать, чтобы принимать только цифры и '-'
- 18. Ограничить EditText, чтобы принимать только Urls в Android
- 19. Ограничить поле ввода номера телефона, чтобы принимать только 6 8 и 10 цифр номера
- 20. как принимать только целые числа в C++
- 21. Ограничить поле ввода, чтобы принимать только номера с диапазоном
- 22. необходимо принимать только числа в поле ввода
- 23. Общий метод для JTextFields принимать только числа
- 24. Расширение TreeMap, чтобы принимать только целые числа -> Целочисленные сопоставления?
- 25. Как принимать только целые числа в текстовом поле WPF
- 26. Ограничить текстовое поле, чтобы принять только 10-значное число
- 27. Поле данных: принимать только положительные числа
- 28. ограничивать «текстовое поле», чтобы принимать только цифры и не более 10 цифр в форме пурпурного тона
- 29. <asp:TextBox> должен принимать только числа
- 30. Ограничить текстовое поле, чтобы разрешить только десятичные числа
Для начала лучше использовать 'JFormattedTextField' с' NumberFormat'. Я не знаю, с верхней части головы, как ограничить диапазон, хотя ... –
Вы можете сделать это с помощью DocumentFilter. –
Ну, разве вы не можете проверить длину строки, полученную из текстового поля, и бросить предупреждение? – user2837260