# Prüfung einer Eingabe in JTextField



## andreas2000 (5. Dezember 2005)

Hallo, ich möchte eine ActionListener Klasse schreiben, die prüft, ob der Eintrag in das Textfeld = "Blume" ist.
Hier mein fehlerhafter Code:

private JTextField tf;

class Blabla implements ActionListener{
...
tf = new JTextField(10);
tf.addActionListener(this);
...
}
public void actionPerformed( ActionEvent e )  
{
	    String s = tf.getText();
	     if(s.equals("Blume")) // mit if(s=="Blume") passiert das gleiche
	        System.out.println("Richtig, der Name lautet `"+s+"`");
	     else {
	        System.out.println("Der Name "+s+" ist leider falsch! Versuchen Sie es noch einmal.");
	        	tf.setText("");
	         }
 }

Ich bekomme immer die "Der Name ... ist leider falsch" Meldung.

Wie kann ich die Eingabe exakt prüfen?


----------



## Xandro (5. Dezember 2005)

Hm ... also erkennen kann ich da fehlerseits gar nichts *grübel*
Sieht ganz typisch aus ... aber ich ziehe es immer in Erwägung für den Fall der Fälle ein .trim() einzufügen,
damit die Leerzeichen rausgekürzt werden.

Vielleicht schleicht sich ja was bei Dir ein...

String s = tf.getText().trim();

Versuchs einfach mal.


----------



## andreas2000 (5. Dezember 2005)

hat leider auch nicht geklappt, vielleicht hat jemand eine ganz andere Idee, Eingaben abzuprüfen?


----------



## andreas2000 (5. Dezember 2005)

Hab die Lösung gefunden, man muss einen ActionCommand definieren:
private static String eintrag = "Blume";

tf = new JTextField(10); 
tf.addActionListener(this);	 
tf.setActionCommand(eintrag); //Der ActionCommand hat vorhin gefehtl

public void actionPerformed( ActionEvent e )  
	  {
	    	String s = tf.getText();
	    		        {
	        	if(eintrag.equals(s))
	        		System.out.println("Richtig, der Name lautet `"+s+"`");
	        	else {
	                                System.out.println("Der Name "+s+" ist leider falsch! Versuchen Sie es noch einmal.");
	        	tf.setText("");
	        }
}

Nun funktionierts!


----------



## Scrapy (5. Dezember 2005)

Also ich würde es mal mit "compareTo" versuchen! 

 Also mit "equals" verlgeicht man die Objekte an sich. Das gleiche geschieht, wenn man 2 Strings mit einem "==" vergleicht!
 Das mit "trim" ist auf jedenfall ratsam, weil es die Leerzeichen vor und hinter dem Wort entfernt.

 Versuchs einfach mal so:

```
public void actionPerformed(ActionEvent e)
{
  String s = tf.getText().trim();
  if(s.compareTo("Blume") == 0)
  {
 	System.out.println("Richtig, der Name lautet: \"" + s + "\"");
  }
  else
  {
 	System.out.println("Der Name: \"" + s + "\" ist leider falsch! Versuchen Sie es noch  einmal.");
 	tf.setText("");
  }
}
```
 Im übrigen: Wenn du keinen Wert auf die Groß- und Kleinschreibung legst, dann kannst du den Text auch mit: "compareToIgnoreCase" vergleichen. (Die Anwendung ist die gleiche!)


----------



## split (5. Dezember 2005)

Scrapy hat gesagt.:
			
		

> Also mit "equals" verlgeicht man die Objekte an sich. Das gleiche geschieht, wenn man 2 Strings mit einem "==" vergleicht!


Falsch.

Mit == vergleicht man nicht die Objekte ansich (wie das bei equal der Fall ist), sondern es wird geprüft, ob die zu vergleichenden Variablen das selbe Objekt referenzieren!


----------



## TommyMo (5. Dezember 2005)

Stimmt! Hier werden nur Objekte verglichen! Außerdem ... ich bin mir nicht 100% sicher, kann man in Java Strings nicht mit "==" vergleichen (zumindest nicht in Version 1.4). Soviel ich weiß geht das lediglich in (Javaclone)C# ! 

Gruß
TOM


----------



## Scrapy (5. Dezember 2005)

split hat gesagt.:
			
		

> Mit == vergleicht man nicht die Objekte ansich (wie das bei equal der Fall ist), sondern es wird geprüft, ob die zu vergleichenden Variablen das selbe Objekt referenzieren!



Okay... hast recht... ich hab's in der Eile so hingeschrieben! :-(


----------



## Snape (5. Dezember 2005)

andreas2000 hat gesagt.:
			
		

> Hab die Lösung gefunden, man muss einen ActionCommand definieren:
> private static String eintrag = "Blume";
> 
> Nun funktionierts!



Aua, auch noch static. Und die anderen Antworten sind auch nicht viel besser ("compareTo"). Halbwissen berät Unwissen...
Ein ActionCommand ist nicht nötig. Ich weiß nicht was Du gemacht hast, aber dieses popelige Beispiel funktioniert einwandfrei und benutzt die von Dir benutzte, etwas merkwürdige Technik, einen ganzen Frame als ActionListener zu definieren:


```
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class DummyFrame extends JFrame implements ActionListener
{
  private String m_sTextField;
  private BorderLayout borderLayout = new BorderLayout();
  private JTextField jtfDummy = new JTextField(20);
  private JButton jbDummy = new JButton();
  
  public DummyFrame()
  {
    super("Dummy Frame");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(200, 300);
    initGUI();
  }
  
  private void initGUI()
  {
    jbDummy.setText("Zeig den Inhalt des Textfelds an");
    jbDummy.addActionListener(this);
//    jbDummy.addActionListener(new ActionListener(){
//      public void actionPerformed( ActionEvent arg0 )
//      {
//        m_sTextField = jtfDummy.getText();
//        JOptionPane.showMessageDialog(null, m_sTextField);
//      }});
    getContentPane().setLayout(borderLayout);
    getContentPane().add(jbDummy, BorderLayout.SOUTH);
    getContentPane().add(jtfDummy, BorderLayout.NORTH);
  }
  public void actionPerformed( ActionEvent arg0 )
  {
    m_sTextField = jtfDummy.getText();
    if ( m_sTextField.equals("Blume") )
      JOptionPane.showMessageDialog(null, "Es wurde 'Blume' eingegeben");
    else
      JOptionPane.showMessageDialog(null, "Es wurde nicht 'Blume' eingegeben");
  }
  public static void main( String[] args )
  {
    new DummyFrame().show();
  }
}
```

Üblicherweise definiert man nicht den ganzen Frame als ActionListener, sondern lässt das ...implements ActionListener weg, ebenso die actionPerformed in der Klasse. Stattdessen werden Konstrukte wie der von mir auskommentierte Codeteil benutzt. Darin kann man sich austoben.


----------



## TommyMo (7. Dezember 2005)

Hi Snape!

Hm ... wie würdest du denn "compareTo" anwenden? Also einen qualitativ bessere Alternative verwenden? Mir würde, ich Halbwissender   , da jetzt nichts besseres einfallen. Aber da dieses Thema ja ziemlich häufig gebraucht wird, wär ich an einerallgemein bessere Lösung interessiert. 

Gruß
TOM


----------



## Snape (7. Dezember 2005)

Moin
compareTo() wird eigentlich bei Sortierungen benutzt. Siehe auch in der Java API nach Comparable und Comparator.


----------



## TommyMo (7. Dezember 2005)

Oki doki! Thx! Ich werd mal, wenn Zeit bleibt reinschaun. Allerdings hast du die Frage noch nicht ganz beantwortet. Wie sieht deine Alternative aus? 

Wo besteht für dich der große Unteschied zwischen equals und compareTo? Equals, soweit ich jetzt weiß, vielleicht geb ich mir damit eine Blöße  :suspekt: , vergleicht doch Referenzen ... . 

TOM


----------



## Snape (7. Dezember 2005)

>Oki doki! Thx! Ich werd mal, wenn Zeit bleibt reinschaun. Allerdings hast du die Frage noch nicht ganz beantwortet. Wie sieht deine Alternative aus? 

Siehe oben, equals() ist ausreichend.

>Wo besteht für dich der große Unteschied zwischen equals und compareTo? Equals, soweit ich jetzt weiß, vielleicht geb ich mir damit eine Blöße  :suspekt: , vergleicht doch Referenzen ... . 

compareTo ist wie gesagt für Sortierungen bzw. Vergleiche auf größer/kleiner. Kann sicher auch für Gleichheitsprüfung benutzt werden (Rückgabewert 0), ist aber nicht primäre Funktion.


----------

