2011-09-20 10 views
5

Sono un problema con l'aggiunta di un testo a un oggetto JTextArea dopo l'uso di un filtro documenti, Ho bisogno di aggiungere una stringa su JTextArea dopo che il testo è stato caricato da un file e restituisce anche una stringa da JTextArea di un altro JFrame alla JTextArea specificataAggiunta di un testo a un oggetto JTextArea dopo l'uso di un filtro documenti

Tutto ha funzionato perfettamente quando non ho utilizzato DocumentFilter.FilterBypass fino a quando non l'ho aggiunto. Funziona ancora un po 'ma solo quando la virgola (,) o lo spazio ("") non vengono aggiunti. Quale non è per la specifica che mi è stata data.

Come posso risolvere questo? O c'è qualche algoritmo o implementazione che non dà questo problema?

Questo è il codice insertString per filtrare la lunghezza, e consentire solo lo spazio e virgola

public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
    // if (string == null || string.trim().equals("") || string.equals(",")) 
    // { 
    // return; 
    // } 

    if (isNumeric(string)) { 
     // if (this.length > 0 && fb.getDocument().getLength() + 
     // string.length() 
     // > this.length) { 
     // return; 
     // } 
     if (fb.getDocument().getLength() + string.length() > this.length || string.trim().equals("") || string.equals(",")) { 
      this.insertString(fb, offset, string, attr); 
     } 
     // if (string == null || string.trim().equals("") || 
     // string.equals(",")) { 
     // return; 
     // } 
     super.insertString(fb, offset, string, attr); 
    } 
    else if (string == null || string.trim().equals("") || string.equals(",")) { 
     super.insertString(fb, offset, string, attr); 
    } 

} 

@Override 
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
    if (isNumeric(text)) { 
     if (this.length > 0 && fb.getDocument().getLength() + text.length() > this.length) { 
      return; 
     } 
     super.insertString(fb, offset, text, attrs); 
    } 
} 

/** 
* This method tests whether given text can be represented as number. This 
* method can be enhanced further for specific needs. 
* 
* @param text 
*   Input text. 
* @return {@code true} if given string can be converted to number; 
*   otherwise returns {@code false}. 
*/ 
private boolean isNumeric(String text) { 
    if (text == null || text.trim().equals("") || text.equals(",")) { 
     return true; 
    } 
    for (int iCount = 0; iCount < text.length(); iCount++) { 
     if (!Character.isDigit(text.charAt(iCount))) { 
      return false; 
     } 
    } 
    return true; 
} 

Le altre due funzioni (aggiungono da file & accodare da un fotogramma diverso) Voglio realizzare innocentemente semplicemente aggiungendo i loro valori stringa su JTextArea filtrati usando questo. Ma viene rifiutato da super.insertString (.....)

+0

Quale codice sei usando al momento che non funziona? Mente postarla? – sealz

+0

Nessun problema, ma è comunque lungo. Devi allegare i codici dei due telegrammi – nnanna

+0

forse solo lo snippet in cui stai cercando di aggiungere "," e ""? – sealz

risposta

1

io non sono sicuro di aver trovato davvero la tua domanda. Se si vuole avere un filtro in cui è possibile incollare i numeri completi o "" e gli spazi bianchi (fine o all'inizio o immesso), ma non è possibile incollare qualsiasi altro testo si può semplicemente cambiare la vostra funzione IsNumeric:

private boolean isNumeric(String text) { 
    text = text.trim(); 
    if(",".equals(text)) return true; 
    ParsePosition position = new ParsePosition(0); 
    java.text.NumberFormat.getNumberInstance().parse(text, position); 
    return position.getIndex() == text.length(); 
} 
+0

non hai bisogno degli altri assegni nel metodo insertString in questo caso – Christian

+0

Grazie per il post, sono stato curioso di questo post per l'ultima settimana, e spero che questa sia una risposta. Quindi, con solo un'ora rimasta, ti assegnerò la taglia. – sealz

+0

Wow, grazie! Spero che risolva davvero il tuo problema. – Christian

0

Potrebbe essere necessario ottenere la posizione di caratura prima di aggiungere il testo. Non ho familiarità con DocumentFilters e presumo che il metodo this.append("stringzzz") non sia disponibile?

Sembra che ci sia qualcosa di sbagliato nel tuo offset. Potrebbe essere necessario configurarlo per ottenere prima una posizione, qualcosa di simile in basso. InsertString() Doc (OffSet)

Come per ottenere la posizione di carati si potrebbe fare qualcosa come TextPane.getCaretPosition(), e passarlo. Invece di usare il FilterByPass?

Qualcosa di simile (come suggerito nel mio link)

this.insertString(TextArea.getCaretPosition(), yourString, null); 

Ecco un link che può essere di qualche aiuto.

Inserting Text without FilterByPass

fatemi sapere se io sono lontano :)

+0

-1, i commenti sulla posizione del cursore non sono correlati al problema. Un documento (o modello) non sa nulla del componente Swing (la vista). Ricorda che un modello può essere condiviso da più componenti. Un DocumentFilter viene utilizzato per modificare il testo prima che venga inserito nel documento. Se il codice OP non funziona, la logica nel DocumentFilter è errata. – camickr

+0

@ camickr Ha senso che mi abbia confuso quando ha detto che ha funzionato, ma solo quando non utilizza caratteri specifici, e poi ha detto che ha funzionato finché non ha fatto il backtrack. Quindi mi ha portato a credere che fosse qualcos'altro. – sealz

+0

@ camickr, ti dispiace se incollo il codice per la logica del filtro di documenti per te da dare un'occhiata. Leggi il javadoc un po 'di più, e sembra che il problema non sia dal documentfilter stesso, ma dalla classe AbstractDocument. – nnanna

Problemi correlati