2013-05-17 4 views
0

Кто-то знает, почему в JtextField, когда я устанавливаю свойство setDocument() -class PlainDocument- когда я запускаю программу, он показывает мне поле нормально, но только я могу ввести символы N-1, когда я устанавливаю длину maxlength для длины N символов.Почему PlainDocument() установлен в JtextField.setDocument() исключает один символ текста

// Block 1 
txtPais.setDocument(new MaxLengthTextCntry()); 

У меня есть еще один класс, который внутренне установить максимальную длину

// Block 2  
public class MaxLengthTextCntry extends MaxLengthGeneric{ 
    public MaxLengthTextCntry( 
     { 
      super(2); 
     } 
    } 

Наконец в MaxLengthGeneric класса

// Block 3 
public abstract class MaxLengthGeneric extends PlainDocument { 

     private int maxChars; 

     public MaxLengthGeneric(int limit) { 
      super(); 
      this.maxChars = limit; 
     } 

     public void insertString(int offs, String str, AttributeSet a) 
       throws BadLocationException { 
      if (str != null && (getLength() + str.length() < maxChars)) { 
       super.insertString(offs, str, a); 
      } 
     } 
    } 

РЕШЕНИЕ

Поддержание Блок 2, я заменил блок 1 на

((AbstractDocument) txtRucnumero.getDocument()).setDocumentFilter(new MaxLengthTextRuc()); 

Блок 3 изменил зависимость от DocumentFilter. Не забудьте реализовать оба родительских метода insertString() и replace() !!

public abstract class MaxLengthGeneric extends DocumentFilter { 

... 

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

     if ((fb.getDocument().getLength() + str.length()) <= maxChars) 
      super.insertString(fb, offs, str, a); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 

    @Override 
    public void replace(FilterBypass fb, int offs, int length, String str, 
      AttributeSet a) throws BadLocationException { 
     if ((fb.getDocument().getLength() + str.length() - length) <= maxChars) 
      super.replace(fb, offs, length, str, a); 
     else 
      Toolkit.getDefaultToolkit().beep(); 
    } 
} 

на основе http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TextComponentDemoProject/src/components/DocumentSizeFilter.java

ИЛИ РЕШЕНИЕ 2 (Или, может быть, важность отладки для Jnewbies жизни: < заменить < =)

** if (str != null && (getLength() + str.length() <= maxChars)) {** 

ответ

6

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

Как я и предложил в своем комментарии, вы должны использовать DocumentFilter. Прочтите раздел из учебника Swing по телефону Implementing a Document Filter для получения дополнительной информации и рабочего примера.

+1

Вы не слушаете ничего, что мы предлагаем. Почтовый код с вашим вопросом, а не в комментариях. Вышеприведенный код не отформатирован или не читается. Кроме того, код не имеет ничего общего с моим ответом. Вы действительно должны прочитать ссылку, которую я вам дал. – camickr

+1

Измените свой вопрос, а не комментарий, чтобы включить [sscce] (http://sscce.org/), возможно, используя один из примеров, цитируемых camickr. – trashgod