2014-01-18 3 views
0

Как ограничить JTextFiled, чтобы принимать только числа менее 10, без слов, пробелов и других специальных символов?Как ограничить JTextFiled, чтобы принимать только числа меньше 10?

+0

Для начала лучше использовать 'JFormattedTextField' с' NumberFormat'. Я не знаю, с верхней части головы, как ограничить диапазон, хотя ... –

+0

Вы можете сделать это с помощью DocumentFilter. –

+0

Ну, разве вы не можете проверить длину строки, полученную из текстового поля, и бросить предупреждение? – user2837260

ответ

-1

Используйте 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 странице о настройке ваш графический интерфейс выглядит так.

+0

Для тех, кто не может ждать, вот статья, в которой подчеркивается использование: http://java.dzone.com/articles/making-gui-builders-obsolete – Pureferret

+0

Вы пили, пожалуйста, перечитайте ваше сообщение здесь, из моего разума – mKorbel

+0

@mKorbel Я не уверен, что вы говорите, но я добавил больше к ответу. – Pureferret

0

Попробуйте: -

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; 
      }   
     } 

    } 
}); 

Надеется, что это поможет.

+0

«ActrionListener» будет запущен только при нажатии клавиши ввода. Любой из других ответов дает лучшее решение здесь. –

2

Опять же, 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(); 
     } 
     }); 
    } 
} 
  • Преимущества:
    • не требуется никаких сообщений об ошибках. Вместо этого он просто предотвращает ввод плохого ввода.
    • Он отлично подходит для вырезания и вставки.
  • Недостатки:
    • нет сообщений об ошибках приведены, и поэтому пользователь не будет знать, почему его текст не принимается.
    • Это немного длинный и громоздкий.
    • Непросто «цепочка» - с помощью нескольких фильтров одновременно, что-то Роб Камик проделал определенную работу.
4

Легче будет использовать компонент, предназначенный для этого:

JSpinner spinner = new JSpinner(); 
spinner.setModel(new SpinnerNumberModel(0, null, 10, 1)); 

Технически JSpinner не является производным от JTextField, он использует один внутренний для редактора части и, таким образом, выглядит как один (плюс у него есть дополнительные кнопки для изменения номера с помощью щелчков мыши).

 Смежные вопросы

  • Нет связанных вопросов^_^