Prüfung einer Eingabe in JTextField

andreas2000

Mitglied
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?
 
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.
 
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!
 
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:
Code:
 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!)
 
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!
 
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
 
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! :-(
 
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:

Code:
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.
 
Hi Snape!

Hm ... wie würdest du denn "compareTo" anwenden? Also einen qualitativ bessere Alternative verwenden? Mir würde, ich Halbwissender :p , 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
 

Neue Beiträge

Zurück