# JTextField, der nur Werte zwischen 100 und 1000 zulässt



## tk80 (8. Jul 2007)

Hallo Leute,

ich bin ein absoluter Java-Neunling und muss ein JTextField erstellen, in dem nur Werte zwischen 100 und 1000 eingegeben werden können, habe es mit insertString versucht, aber irgendwie mache ich was falsch und habe überhaupt keine Idee und bitte deshalb um Hilfe.

DANKE!!


tk


----------



## doctus (8. Jul 2007)

http://www.java-forum.org/de/viewtopic.php?t=7909
sollte weiterhelfen.

lg doctus


----------



## tk80 (8. Jul 2007)

habe ich schon gesehen, aber entweder bin ich zu doof oder habe einfach zu wenig erfahrung...


----------



## doctus (8. Jul 2007)

da gibt es ja bereits ein beispiel für ein Integer-Document.

du speicherst dir einfach den geparsten wert in einer variable

int i;

i = Integer.parseInt(...);

nach dem catch-block, überprüfst du, ob der wert den vorgaben entspricht. wenn ja, machst du den aufruf
super.insertString(offset,s, attributeSet);

sonst einfach return;

lg doctus


----------



## tk80 (8. Jul 2007)

ach so, erst nach dem catch block!!! jetzt weiss ich, wo mein fehler war, vielen dank!


----------



## tk80 (8. Jul 2007)

wie kann man nur so doof wie ich sein


----------



## doctus (8. Jul 2007)

nicht so pessimistisch. jeder fängt mal an.


----------



## tk80 (8. Jul 2007)

ich bin doch zu doof..
was mache ich falsch?

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FirstGUI extends JFrame {

	private JPanel panel;

	private JTextField txt;

	public FirstGUI() {
		super("Fenster");
		setLocation(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout(5, 5));

		panel = new JPanel(new GridLayout(1, 1));
		txt = new JTextField();

		panel.add(txt);

		getContentPane().add(panel);

		pack();
		setVisible(true);

		class Feld extends PlainDocument

		{
			Feld(JTextField jTxt) {
				this.txt = jTxt;

			}

			public void insertString(int offset, String s,
					AttributeSet attributeSet) throws BadLocationException {
				int i;

				try {
					i = Integer.parseInt(s);
				} catch (Exception ex) //only allow integer values
				{
					Toolkit.getDefaultToolkit().beep(); //macht ein DÜT
					//System.out.println("Keine Zahl!");
					return;
				}
				if (i > 100 & i < 1000) {
					super.insertString(offset, s, attributeSet);
				}
				return;

			}

		}

	}

	public static void main(String[] args) {
		FirstGUI g = new FirstGUI();
	}
}


----------



## madboy (8. Jul 2007)

tk80 hat gesagt.:
			
		

> was mache ich falsch?


Du verwendest keine Code-Tags und schreibst nicht, was nicht funktioniert :wink:


----------



## tk80 (8. Jul 2007)

ich kann dann einfach alles eingeben...zahlen, buchstaben usw...


----------



## Drake (9. Jul 2007)

Hallo

dein JtextField muss natürlich auch noch mitkriegen, dass es sich jetzt anders zu verhalten hat.


```
txt = new JTextField(new Feld());
```

Dann wüder deine Gui Klasse so aussehen:

```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class FirstGUI extends JFrame {

	private JPanel panel;

	private JTextField txt;

	public FirstGUI() {
		super("Fenster");
		setLocation(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout(5, 5));

		panel = new JPanel(new GridLayout(1, 1));
		txt = new JTextField(new Feld());

		panel.add(txt);

		getContentPane().add(panel);

		pack();
		setVisible(true);

		

	public static void main(String[] args) {
		FirstGUI g = new FirstGUI();
	}
}
```

und dann am besten noch die Feld Klasse in eine eigene Datei packen:


```
class Feld extends PlainDocument

        public void insertString(int offset, String s,  AttributeSet attributeSet) throws BadLocationException {
            int i;

            try {
               i = Integer.parseInt(s);
            } catch (Exception ex) //only allow integer values
            {
                 return;
            }

            if (i > 100 && i < 1000) {
               super.insertString(offset, s, attributeSet);
            }
            return;

         }

      }
```


----------



## tk80 (9. Jul 2007)

kriege aber die fehlermeldung :"The method Feld() is undefined for the type FirstGUI"


----------



## tk80 (9. Jul 2007)

jetzt kann ich zwar nur zahle eingeben, aber keine 0 und alle zahlen und nicht nur zahlen zwischen 100 und 1000
was ist hier falsch?


----------



## mikachu (9. Jul 2007)

tk80 hat gesagt.:
			
		

> kriege aber die fehlermeldung :"The method Feld() is undefined for the type FirstGUI"


du musst noch zwei weitere parameter angeben in dem konstruktor von JTextField.

```
JTextField( Document doc, String text, int columns );
```


----------



## mikachu (9. Jul 2007)

tk80 hat gesagt.:
			
		

> jetzt kann ich zwar nur zahle eingeben, aber keine 0 und alle zahlen und nicht nur zahlen zwischen 100 und 1000
> was ist hier falsch?


also, wenn ich den code ausführe, erscheint zwar das textfeld, aber kann auffer tasta rumhämmern, was aber keine konsequenzen hat. das textfeld bleibt leer...


----------



## thE_29 (9. Jul 2007)

Was auch klar ist!

Da in der Zahl immer nur 1 Stelle ist und 0 ist nun mal nicht größer wie 100!

Am besten ist, du nimmst nen JSpinner!


----------



## tk80 (9. Jul 2007)

also, jetzt habe ich erreich, dass nur maximal 4-stellige zahlen eingegeben werden können, wenn die zahl > 1000 oder  < 100 ist, will ich die fehlermeldung "nur zahlen zw 100 und 1000 sind erlaubt"...

```
public void insertString(int offset,  String string, AttributeSet attSet)
	    	throws BadLocationException 
	    
	    	{
				int i;
				
				if ((getLength() + string.length()) <= 4 ) 
				{
					try 
					{   
						i=Integer.parseInt(string);
					}
					
					catch (Exception exception) 
					{
						Toolkit.getDefaultToolkit().beep(); 
						return;
					}
					if(i>=100 && i<1001) {
					
					super.insertString(offset,string, attSet); }
					
					System.out.println("nur zw ...");
					return;
					
				}
					

	    	}
```

außerdem will ich, dass es beep macht, wenn die zahl 5 stellig ist, funktioniert aber nicht, kann zwar keine 5 stellige zahl eingeben, aber beep macht es nicht
wenn die zahl <100 & >1000 ist muss auch eine fehlermeldung erscheinen, habe das mit System.out.println("nur zw ..."); probiert, aber "nur zw...." kriege ich nach jeder eingabe...
kann mir bitte jemand helfen? habe schon gegooglt...
DANKE!


----------



## thE_29 (9. Jul 2007)

Dann musst du im else von deiner if Abfrage eben Toolkit.beep machen!


----------



## Guest (9. Jul 2007)

dann macht es aber nach jeder eingabe beep...


----------



## thE_29 (9. Jul 2007)

Wo hast du das bitte den gemacht?


```
public void insertString(int offset,  String string, AttributeSet attSet) throws BadLocationException
         
     {
       int i;
       
       if ((getLength() + string.length()) <= 4 )
       {
         try
         {   
           i=Integer.parseInt(string);
         }
         
         catch (Exception exception)
         {
           Toolkit.getDefaultToolkit().beep();
           return;
         }
         if(i>=0 && i<1001) {
           super.insertString(offset,string, attSet); 
           System.out.println("NICHT BEEP!");
         }
         System.out.println("nur zw ...");
         return;
       }
       else
       {
         Toolkit.getDefaultToolkit().beep();
         System.out.println("BEEP");
       }
       
       
     }
```

Macht beep wenn die Eingabe größer 4 ist oder es keine Zahl ist!


----------



## tk8 (9. Jul 2007)

aber 
	
	
	
	





```
if(i>=0 && i<1001)
```
 funhktioniert nicht, muss ich das dann mit offset machen?


----------



## thE_29 (9. Jul 2007)

Das funktioniert sehr woll!

Warum sollte das nicht funktionieren? Deine Aussagen helfen NULL weiter! Definiere mal was nicht funktioniert!

Und willst du das nicht verstehen, das eine if Abfrage auf i>=100 nicht geht?
Wenn du zB 1 eingibst, ist i = 1 und das ist NIE größer 100!
Und 100 wird nun mal mit 1 + 0 + 0 eingetippt! Und 0 ist genauso nicht größer als 100!

Nimm nen JSpinner und aus!


----------



## tk8 (9. Jul 2007)

ich beschäftige mich erst seit 3 wochen mit java, könntest du mir erklären, wie das mit dem jspinner funktioniert?


----------



## tk8 (9. Jul 2007)

habe jetzt gekuckt was ein jspinner ist, ich brauche aber JTextField...wenn der benutzer zb 1001 eigubt, muss eine fehlermeldung kommen....


----------



## thE_29 (9. Jul 2007)

Und wenn die Eingabe gar nicht geht? Warum sollte man da eine Fehlermeldung ausgeben?


----------



## thE_29 (9. Jul 2007)

Wie wärs wenn du einfach das LongDocument nimmst!

Nen keyListener auf Enter abfragst und dann überprüfst? Du kannst niemals während dem Betrieb überprüfen ob die Eingabe > 100 sein wird!
Woher auch? Wenn der 1 eintippt, kann der nachher 6x0 eintippen und du hast 1 mio oder er tippt nix mehr und hat 1!

Das würde vom logischen Aspekt mit dem Document her nicht gehen! Desweiteren wann willst du ne Fehlermeldung? Während der Eingabe, nach der Bestättigung, etc..


----------



## tk8 (9. Jul 2007)

die fehlermeldung soll nach der  bestättigung kommen

habe gerade folgendes geschrieben:

```
//	Fälle 1001 < i < 1009 unterbinden
	   if(offset==3) 
	   {
	     if(textField.getText().substring(2,3).equals("0")) 
	      {
	         int zahl = new Integer(string).intValue();
	    	if(zahl>0) 
	    	{ Toolkit.getDefaultToolkit().beep(); 
		    return;
	    	}
	    }
	  }
```

somit kann mann nicht mehr 1001-1009 eingeben. kann man das so machen oder ist das jetzt komplett fakscher weg?
danke


----------



## thE_29 (9. Jul 2007)

Gib mal 999 ein!
Geh dann mal mit Cursor auf Position 0 und tipp nochmals 9 ein 

Oha, aufeinmal hast du 9999 ^^

Willst du ein maximale Grenze? Das kann ich dir bauen!


----------



## thE_29 (9. Jul 2007)

```
public class LimitIntDocument extends PlainDocument
   {
     private int maxVal = -1;
     public LimitIntDocument (int maxVal)
     {
       this.maxVal = maxVal;
     }
     
     public void insertString(int offset,  String string, AttributeSet attSet) throws BadLocationException

     {
       int i;

       if ((getLength() + string.length()) <= 4 )
       {
         try
         {
           i=Integer.parseInt(string);
         }

         catch (Exception exception)
         {
           Toolkit.getDefaultToolkit().beep();
           return;
         }
         if(maxVal != -1)
         {
           StringBuffer strBuf = new StringBuffer(getText(0, getLength()));
           strBuf = strBuf.insert(offset, string);
           if(Integer.parseInt(strBuf.toString()) > maxVal)
           {
             System.out.println("GEHT NICHT ZAHL ZU HOCH!");
             Toolkit.getDefaultToolkit().beep();
             return;
           }
         }         
         super.insertString(offset,string, attSet);
         return;
       }
       else
       {
         Toolkit.getDefaultToolkit().beep();
         System.out.println("BEEP");
       }


     }
   }
```


----------

