2014-10-23 2 views
1

Я знаю, что это общий вопрос, но я пытаюсь создать текстовое поле, которые принимают только ИНТ номер, и это почти сделано, вот код:DocumentFilter для отрицательного и положительного целого числа

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

nome = new JFormattedTextField(); 
      nome.setHorizontalAlignment(SwingConstants.CENTER); 
      nome.setColumns(2); 

      DocumentFilter filtro = new FiltroNumero(); 
      ((AbstractDocument) nome.getDocument()).setDocumentFilter(filtro); 

      panel.add(nome); 

DocummentFilter:

public class FiltroNumero extends DocumentFilter{ 

    public void insertString(DocumentFilter.FilterBypass fb, int offset, int length, 
       String text, javax.swing.text.AttributeSet attr) 

       throws BadLocationException { 
        fb.insertString(offset, text.replaceAll("[^-0-9]", ""), attr); 
     } 
} 

При этом, TextField будет принимать только цифры и "-", но это означает, что "1" является возможное значение.

Что мне нужно - это способ заставить текстовое поле не принимать минус после первого символа.

Если кто-то может мне помочь, я буду очень рад :)

+1

Вы должны либо проверить, если текст равна (или содержит '-'), и что это в самом начале, когда значение являются добавляется ... – MadProgrammer

+0

@MadProgrammer либо это, либо только разрешить 0-9 для каждого отдельного символа, я чувствую, что проверил бы еще больше проблем, которые появятся в будущем, тем более, что это часть параметров. – DreadHeadedDeveloper

+1

@DreadHeadedDeveloper. Я думал, что вы можете также проверьте наличие символа '-', удалите его из входящего' String' и вставьте его в начале документа, в зависимости от того, существовал он или нет ... так что нажатие '-' всегда было бы его в начало (или конец на основе потребностей) – MadProgrammer

ответ

3

Вы можете просто получить весь текст из Document (который является, прежде чем заменить), а затем создать новую строку из этого текста документа, добавив аргумент text. Затем просто проверяйте на полное регулярное выражение, которое соответствует целым числам (отрицательным или положительным). Если это соответствует, замените. Что-то вроде:

@Override 
public void replace(FilterBypass fb, int offs, int length, 
     String str, AttributeSet a) throws BadLocationException { 

    String text = fb.getDocument().getText(0, 
      fb.getDocument().getLength()); 

    StringBuilder builder = new StringBuilder(text); 
    builder.insert(offs, str); 
    String newText = builder.toString(); 

    // check 
    System.out.println("text = " + text 
        + ", offset = " + offs 
        + ", newText = " + newText); 

    if (newText.matches("(-)?\\d*")) { 
     super.replace(fb, offs, length, str, a); 
    } else { 
     Toolkit.getDefaultToolkit().beep(); 
    } 
} 

Примечание: Вы должны использовать replace, а не insertString, хотя не мешало бы переопределить как.

Вот полный демо

import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class FilterDemo { 

    public FilterDemo() { 
     JFrame frame = new JFrame(); 
     frame.add(createFilteredField()); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

    } 

    private JTextField createFilteredField() { 
     JTextField field = new JTextField(10); 
     AbstractDocument document = (AbstractDocument) field.getDocument(); 
     document.setDocumentFilter(new DocumentFilter() { 

      @Override 
      public void replace(FilterBypass fb, int offs, int length, 
        String str, AttributeSet a) throws BadLocationException { 

       String text = fb.getDocument().getText(0, 
         fb.getDocument().getLength()); 

       StringBuilder builder = new StringBuilder(text); 
       builder.insert(offs, str); 
       String newText = builder.toString(); 

       // check 
       System.out.println("text = " + text 
           + ", offset = " + offs 
           + ", newText = " + newText); 

       if (newText.matches("(-)?\\d*")) { 
        super.replace(fb, offs, length, str, a); 
       } else { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 


      @Override 
      public void insertString(FilterBypass fb, int offs, String str, 
        AttributeSet a) throws BadLocationException { 

       String text = fb.getDocument().getText(0, 
         fb.getDocument().getLength()); 

       StringBuilder builder = new StringBuilder(text); 
       builder.insert(offs, str); 
       String newText = builder.toString(); 

       // checks 
       System.out.println("text = " + text 
           + ", offset = " + offs 
           + ", newText = " + newText); 

       if (newText.matches("(-)?\\d*")) { 
        super.insertString(fb, offs, str, a); 
       } else { 
        Toolkit.getDefaultToolkit().beep(); 
       } 
      } 
     }); 
     return field; 
    } 

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

Большое спасибо! Я пытаюсь понять код, но он работает, так что все в порядке, Еще раз спасибо! –

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