Java JTextField Apostroph verbieten

GermanGhettos

Lt. Commander
Registriert
Apr. 2011
Beiträge
1.106
Hallo,

ich möchte in einem JTextField ein Sonderzeichen verbieten. In meinem Fall das Apostroph .
Das klappt auch mit anderen Zeichen ganz gut, allerdings nicht mit dem Apostroph .

Code:
txtKommentar.addKeyListener(new KeyAdapter(){   	
	    	            public void keyTyped(KeyEvent e){
	    	                char g = e.getKeyChar();	    	
	    	                if(g == KeyEvent.VK_QUOTE){	    
	    	                	txtKommentar.setText("");	    	
	    	                    JOptionPane.showMessageDialog(null, "Bitte kein Apostroph verwenden!");
	                }
   	            }
   	        });


So sieht es aktuell aus.
Wenn ich einen Buchstaben wie VK_A nehme, dann ploppt die Meldung wie gewünscht auf.
Bei VK_QUOTE passiert nichts. Weder bei den Anführungszeichen ", noch beim Apostroph '.
Dieses Apostroph Zeichen gibts ja irgendwie nicht bei VK_ als KeyEvent.
Weiß jemand, wie ich das in den Code einbinden kann, damit die Meldung beim Apostroph aufploppt?


Gruß
G.G.
 
Man könnte überprüfen, ob der gesamte String des Textfeldes ein ' oder " enthält und diesen einzelnen dann löschen, aber nicht den Rest des Strings.
Dann kann auch die Meldung aufpoppen.

Also auch in dem Listener einfach

Code:
txtKommentar.getText().contains("'")

überprüfen.
 
Code:
txtKommentar.addKeyListener(new KeyAdapter(){   	
	    	            public void keyTyped(KeyEvent e){	    	
	    	                if(txtKommentar.getText().contains("'")){	    
	    	                	txtKommentar.setText("");	    	
	    	                    JOptionPane.showMessageDialog(null, "Bitte kein Hochkomma verwenden!");
	                }
   	            }
   	        });

Das funktioniert :D
Allerdings noch nicht zu 100% optimal.
Wenn ich das Apostroph eingebe, akzeptiert er es erstmal.
Wenn ich dann aber das nächste Zeichen eingebe, ploppt die Meldung korrekt auf.
Er prüft die Zeile also praktisch erst nachdem das Apostroph schon eingetippt wurde.
Gab es nicht die Möglichkeit, dass er die Meldung aufploppen lässt, bevor das Apostroph im Textfeld landet?
 
das liegt daran, dass keyTyped() gefeuert wird, bevor das JTextField geupdated wird. Da du ohnehin ein (Key)Event betrachtest, schau dir doch einfach die wertigkeit an (zeile 3):
Code:
if(e.getKeyChar() == "'")
um das update des feldes dann zu verhindern wuerde ich mir die SO antwort hier einverleiben: http://stackoverflow.com/a/8316090
 
Ich habe jetzt eine für mich einfachere passende Lösung gefunden.
Ich nutze den oben genannten gettext().contains Befehl einfach beim Bestätigungsbutton,
denn dort mache ich noch mal eine Sicherheitsabfrage.
Auf den Button lege ich dann die IF Abfrage, ob einer der Textfelder ein ' enthält und wenn ja,
dann wird das entsprechende Feld geleert und das Pop Up geöffnet ^^
Dann kann der SQL Befehl auch nicht abgeschickt werden.
Ist sicherlich nicht die eleganteste Lösung, aber effektiv.


Edit: Ach ja und schönen Dank für die schnelle Antwort :-)
 
Zuletzt bearbeitet:
Das ist so nicht effektiv. Was löst dieser Button denn aus? Das Java-Formular wird ja sicher nicht der einzige Weg sein, den Request zu verschicken?

Und wenn ich meinen POST dann selbst forge, dann bin ich für die SQL-Injection authorisiert?
 
Verwende gegen SQL Injection bitte keine eigene Logik, verwende ein ORM Framework oder verwende SQL Query Parameter. Stored Procedures können auch helfen....
 
GermanGhettos schrieb:
Gab es nicht die Möglichkeit, dass er die Meldung aufploppen lässt, bevor das Apostroph im Textfeld landet?

Es gibt mehrere Möglichkeiten so etwa anzugehen. Eine ist, Änderungen des Dokumentes zu verfolgen.

Code:
public static void main(String... args)
{
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            JTextField t = new JTextField(20);
            t.setFont(t.getFont().deriveFont(34f));
            t.getDocument().addDocumentListener(new DocumentListener()
            {
                @Override
                public void removeUpdate(DocumentEvent e)
                {
                    changedUpdate(e);
                }

                @Override
                public void insertUpdate(DocumentEvent e)
                {
                    changedUpdate(e);
                }

                @Override
                public void changedUpdate(DocumentEvent e)
                {
                    t.setBackground(t.getText().contains("'") ? Color.red : null);
                }
            });
            JFrame f = new JFrame("Computerbase");
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.add(t);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    });
}
 
Es gibt keine andere Möglichkeit den SQL Befehl abzusetzen, außer über den Button. (Zumindestens ist mir keine bekannt)
Der Zugriff auf das Tool ist Passwortgeschützt. Erst durch korrekte Anmeldedaten wird eine verschlüsselte Verbindung zur Datenbank hergestellt :D
Durch meine Methode kann kein Sonderzeichen abgeschickt werden, da das Programm das jetzt vor dem abschicken stets unterbindet.
Hab es schon ausgiebig getestet.

Ich muss dazu auch sagen, dass es um ein firmeninternes Tool im eingeschränkten Nutzerkreis geht.
Ist also nichts für die Öffentlichkeit.
Am Ende geht es darum, dass der Sachbearbeiter da kein Hochkomma reinhämmert :p

Vielen Dank für die zahlreichen Infos.

Gruß
G.G.
 
Zurück
Oben