TextFieldFilter - Wenn Textfeld leer dann setze 0

Sebastian88

Mitglied
Hallo liebe Forum-Gemeinde,

habe ein kleines Problem bei einem Informatikprojekt für mein Studium, als Chemiker hat man halt wenig Ahnung von Info.

Bei meinem TextfieldFilter muss ich noch ergänzen, dass wenn das Textfeld nicht gefüllt bzw. leer ist das Programm eine Null zurückgeben soll, damit in einer anderen Klasse ohne Fehlermeldung weiter gerechnet werden soll, andernfalls bekomme ich immer die Fehlermeldung:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String

Hier mal der Code zu meinem Textfieldfilter den ich aus einem Forum habe:

[JAVA=42]
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package formular.util;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
*
* @author Sebastian
*/
public class TextFieldFilter extends PlainDocument {
public static final String NUMERIC = "0123456789";

protected String acceptedChars = null;

protected boolean negativeAccepted = false;

public TextFieldFilter() {
this(NUMERIC);
}

public TextFieldFilter(String acceptedchars) {
acceptedChars = acceptedchars;
}

public void setNegativeAccepted(boolean negativeaccepted) {
if (acceptedChars.equals(NUMERIC)) {
negativeAccepted = negativeaccepted;
acceptedChars += "-";
}
}

public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
if (str == null)
return;
for (int i = 0; i < str.length(); i++) {
if (acceptedChars.indexOf(str.valueOf(str.charAt(i))) == -1)
return;
}


if (negativeAccepted) {
if (str.indexOf(".") != -1) {
if (getText(0, getLength()).indexOf(".") != -1) {
return;
}
}
}

if (negativeAccepted && str.indexOf("-") != -1) {
if (str.indexOf("-") != 0 || offset != 0) {
return;
}
}

super.insertString(offset, str, attr);
}
}
[/code]

Hat da jemand ne Idee, wie das Problem schnell gelöst werden kann? Wäre super 🙂
 
In insertString() machst du einen if("".equals(str)){ super.insertString(offset,"0",attr);}
(natürlich schöner formatiert 😀 )
 
Danke für deine schnelle Antwort, funktioniert leider noch nicht. Mein Code sieht jetzt so aus, bzw. der Ausschnitt:

Java:
  public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
    if (str == null)
      return;
    if("".equals(str)){ 
          super.insertString(offset,"0",attr);}
    for (int i = 0; i < str.length(); i++) {
      if (acceptedChars.indexOf(str.valueOf(str.charAt(i))) == -1)
        return;}

Hab ich da was falsch gemacht? Hier ist nochmal der Code für den TextfieldFilter bezogen auf ein Textfield

Java:
        TextFieldFilter tffA = new TextFieldFilter (TextFieldFilter.NUMERIC);
        tffA.setNegativeAccepted(false);
        this.AktiveSteuernTextfeld.setDocument(tffA);
 
Das wird so nicht funktioniert, insertString wird nur aufgerufen wenn wirklich etwas eingefügt wird, ausserdem ist str nicht der gesamte String vom Textfeld sondern der der eingefügt wird.
Du könntest etwas über die remove-Methode basteln, mittels getText kommst du übrigens an den gesamten String des Documents.
 
Nachdem ich jetzt schon eine ganze Weile rum gegoogelt habe und habe das Forum etwas durchstöbert habebin ich trotzdem noch weit entfernt von der Problemlösung, auch mit Hilfe von einer remove-methode oder einem RemoveactionListener etc. ???:L

Kriegt man das nicht so irgendwie einfach hin?
 
Java:
JTextField tf = new JTextField();
Document doc = tf.getDocument();
PlainDocument plainDoc;
if (doc instanceof PlainDocument){		
   plainDoc = (PlainDocument)doc;
   plainDoc.setDocumentFilter(tffA); 
}
//...
String tfText = tf.getText();
if ( tfText.equals("") ){
    tfText = "0";
}
// ... parse ...
 
Zuletzt bearbeitet:
Also der Titel des Threads verrät doch eigentlich schon die Lösung...

Java:
        if (jTextField1.getText().length() == 0)
        {
            jTextField1.setText( "0");
        }

Wenn die Länge des Textes 0 ist, dann setze den Text auf "0"

Mal ganz simpel ...
 
Der Vorschlag von HarleyDavidson gefällt mir gut.

Also der Titel des Threads verrät doch eigentlich schon die Lösung...

Java Code: Quelltext in neuem Fenster öffnen
if (jTextField1.getText().length() == 0)
{
jTextField1.setText( "0");
}

Wenn die Länge des Textes 0 ist, dann setze den Text auf "0"

Mal ganz simpel ...

Leider beisst sich das anscheinend mit dem TextFieldFilter. Kann ich das nicht auch da einbauen?

Java:
package formular.util;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 *
 * @author Sebastian
 */
public class TextFieldFilter extends PlainDocument {
  public static final String NUMERIC = "0123456789";

  protected String acceptedChars = null;

  protected boolean negativeAccepted = false;

  public TextFieldFilter() {
    this(NUMERIC);
  }

  public TextFieldFilter(String acceptedchars) {
    acceptedChars = acceptedchars;
  }

  public void setNegativeAccepted(boolean negativeaccepted) {
    if (acceptedChars.equals(NUMERIC)) {
      negativeAccepted = negativeaccepted;
      acceptedChars += "-";
    }
  }
  
  public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
    if (str == null)
      return;
    if ( str.length() ==0)
     str.("0");
      
    for (int i = 0 ; i < str.length(); i++) {
      if (acceptedChars.indexOf(str.valueOf(str.charAt(i))) == -1)
        return;}

    
  
    
    if (negativeAccepted) {
      if (str.indexOf(".") != -1) {
        if (getText(0, getLength()).indexOf(".") != -1) {
          return;
        }
      }
    }

    if (negativeAccepted && str.indexOf("-") != -1) {
      if (str.indexOf("-") != 0 || offset != 0) {
        return;
      }
    }

    super.insertString(offset, str, attr);
  } 
}

Siehe Zeile 36/37 oder geht das gar nicht?
 
Du könntest auch einen FokusListener einbauen, der bei Fokusverlieren nachguckt, ob das Feld leer ist und dann eine 0 setzt. Das geht ziemlich einfach mut der passenden IDE. Bei eclipse zum Beispiel rechte Maustaste auf das Textfeld und dann unter EventHandling den FokusLostListener (Schreibweise ähnlich) auswählen.
 
Das ist eine gute Idee, habe ich auch schonmal verwendet für meinen Sudoku-Löser (wenn man ein Feld mit irgendwas außer 1-9 befüllt hat, wurde das Feld nach Verlassen geleert):

Java:
    //FocusLost - Methode: Muss nur einmal geschrieben werden
    private void focusLost( java.awt.event.FocusEvent evt )
    {
        //welches Textfeld wurde verlassen?
        JTextField current = (JTextField) evt.getSource();
        //Wenn das Textfeld bei Verlassen die Länge 0 hat oder leer ist
        if ( current.getText().length() == 0 || current.getText().isEmpty() )
        {
            current.setText( "0");
        }
    }

    //Beispiel: Jedem Textfeld, bei dem automatisch eine 0 eingefügt werden soll, 
    //muss dieser Listener hinzugefügt werden
    jTextField.addFocusListener (new java.awt.event.FocusAdapter()
        {
        public void focusLost( java.awt.event.FocusEvent evt )
        {
            SudokuSolutioner.this.focusLost( evt );
        }
    }
 

Zurück
Oben