2013-06-25 3 views
1

Я ограничиваю свой JTextFields, чтобы принимать только цифры. Для этого я использовал следующий код.Общий метод для JTextFields принимать только числа

// my textboxes 
    t1=new JTextField(10); 
    t2=new JTextField(10); 
    t3=new JTextField(10); 

    // for the first one 
    t1.addKeyListener(new KeyAdapter() { 
     public void keyTyped(KeyEvent e) { 
      char c = e.getKeyChar(); 
      if (!((c >= '0') && (c <= '9') || 
      (c == KeyEvent.VK_BACK_SPACE) || 
      (c == KeyEvent.VK_DELETE))) { 
      getToolkit().beep(); 
      e.consume(); 
      } 
     } 
     }); 

Пусть у меня есть 20 texboxes, которые нуждаются в таком же проверке достоверности. Так нужно ли писать этот код 20 раз? Могу ли я написать общий метод для реализации этого? Я новичок в Swing.

+2

Не используйте KeyListener все, что вы делаете, так что не имеет никакого влияния на копирование/вставка и может испортить JTextField другими способами. Используйте DocumentFilter. Вы можете найти примеры этого на этом сайте и в учебниках. Например: [здесь] (http://stackoverflow.com/a/9346426/522444). –

+0

Посмотрите на этот вопрос, он должен решить вашу проблему: http://stackoverflow.com/questions/14215847/jtextfield-validation-for-numbers-and-one-decimal-point/14219756#14219756 Точнее, мой ответ , Это пользовательский компонент, который принимает только номер. –

+0

Вы получаете тонны неправильного ответа. Жалкие. –

ответ

9

Опять же, использовать DocumentFilter как это будет обрабатывать копирования и вставки, это позволит фильтровать до того Документ принимает текст:

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

public class DocListenerEg extends JPanel { 
    private static final int FIELD_COUNT = 5; 
    private JTextField[] fields = new JTextField[FIELD_COUNT]; 

    public DocListenerEg() { 
     MyDocFilter myFilter = new MyDocFilter(); 
     for (int i = 0; i < fields.length; i++) { 
     fields[i] = new JTextField(5); 
     ((PlainDocument) fields[i].getDocument()).setDocumentFilter(myFilter); 
     add(fields[i]); 
     } 
    } 

    private class MyDocFilter extends DocumentFilter { 
     public void insertString(DocumentFilter.FilterBypass fb, int offset, 
      String text, AttributeSet attr) throws BadLocationException { 
     for (char c : text.toCharArray()) { 
      if (!Character.isDigit(c)) { 
       return; 
      } 
     } 
     fb.insertString(offset, text.toUpperCase(), attr); 
     } 

     public void replace(DocumentFilter.FilterBypass fb, int offset, 
      int length, String text, AttributeSet attrs) 
      throws BadLocationException { 
     for (char c : text.toCharArray()) { 
      if (!Character.isDigit(c)) { 
       return; 
      } 
     } 
     fb.replace(offset, length, text.toUpperCase(), attrs); 
     } 
    } 

    private static void createAndShowGui() { 
     DocListenerEg mainPanel = new DocListenerEg(); 

     JFrame frame = new JFrame("DocListenerEg"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+2

+1 .. @log_in см. [This] (http://stackoverflow.com/questions/14305921/detecting-jtextfield-deselect-event/14305952#14305952) тоже (показывает другие способы, такие как 'InputVerfier' и' JFormattedTextField') –

0

Сохранить класс Анонимус в переменную:

KeyListener keyListener= new KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     char c = e.getKeyChar(); 
     if (!((c >= '0') && (c <= '9') || 
     (c == KeyEvent.VK_BACK_SPACE) || 
     (c == KeyEvent.VK_DELETE))) { 
     getToolkit().beep(); 
     e.consume(); 
     } 
    } 
    } 

А потом

t1.addKeyListener(keyListener); 
t2.addKeyListener(keyListener); 
t3.addKeyListener(keyListener); 
... 
+0

Опять же, никогда не используйте KeyListener для этого. –

+0

@HovercraftFullOfEels Почему бы не использовать KeyListener? Оно работает. –

+0

@SriHarshaChilakapati: Это не для копирования и вставки! Опять же, отбросьте это, пожалуйста. –

0

Создать класс под названием:

NumberOnlyTextField

Сделать продлить JT extField и добавьте в конструктор код addKeyListener (..). Там у вас есть собственное поле проверки правильности номера.

+2

Опять же, никогда не используйте KeyListener для этого. Пожалуйста, не рекомендуем этого. Не вводите в заблуждение новичков. –

+1

Там может быть лучший способ фильтрации текстового поля. Но это не вопрос его вопроса. Он хотел знать, как применять повторное использование в своем коде. –

+0

Тем не менее, это плохая практика. –

0

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

public boolean checkToBeNumberInput(char c, KeyEvent e){ 
if(!char c.matches("[0-9]")|| 
    (c == KeyEvent.VK_BACK_SPACE) || 
    (c == KeyEvent.VK_DELETE))) { 
    getToolkit().beep(); 
    e.consume(); 
    return false; 

} 
return true; 
} 

Затем вызовите для этого булева метода, и если он возвращает истину:

if(checkToBeNumberInput()==false){ 
System.out.println("only numbers are allowed!"); 
} 

Это быстрый проект, но я надеюсь, что это помогает кто-то

0

// взгляд событие Keypressed . : частная пустота montoingresoKeyPressed (java.awt.event.KeyEvent ЭВТ) {

if(Character.isLetter(evt.getKeyChar())) 
    { 
     //do what you want on this event, when key is pressed named evt 
    } 

}