ich hab ein problem, was ich aber ehrlichgesagt nicht wirklich weis ist, warum es ein problem ist!
Hab ein Programm geschrieben, was bei mir tadellos läuft!
Aller dings im Standort München nicht! Sie verwenden die Java Version 1.4.2.. und ich die 1.5.0..!
Es passiert nur in einer Überprüfung ein komischer Fehler?
Code:
if (dateText.matches("\\d\\d\\x2E\\d\\d\\x2E\\d\\d\\d\\d"))
{
dateField.setText(dateText);
}
else
{
JOptionPane.showMessageDialog(null, "Bitte geben Sie das Datum im Format tt.mm.jjjj ein", "Hinweis", JOptionPane.ERROR_MESSAGE);
dateField.grabFocus();
dateField.selectAll();
flag=false;
}
Und zwar verursacht die JOptionPane eine StackOverFlow!!!!! Wieso weshalb warum!
Mittler weilen beschäftigen sich 3 Kollegen mit dem Fehler, aber keiner kann was finden?
2006-08-04 11:23:25,921 [AWT-EventQueue-0] ERROR de.medit.util.StringUtils - Fehler beim Konvertieren des Datums!
java.text.ParseException: Unparseable date: "gg"
at java.text.DateFormat.parse(DateFormat.java:335)
at de.medit.util.StringUtils.toDate(StringUtils.java:146)
at de.medit.xplanner.export.ExportGuiSheets$PushButtonActionListener.actionPerformed(ExportGuiSheets.java:142)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Jo, da liegt das Problem. Wie Wildcard schon geschrieben hat mußt du das grabFocus entfernen. Oder du packst den ganzen Code in einen Thread und lässt ihn über SwingUtilitis.invokeLater ausführen.
Das ist ein Knownbug in Swing, da bin ich auch schon drauf reingefallen ;-)
ÄHHHH wenn ich ein gültiges Format eingebe, gehts ja ehhh!
Nur wenn ich ein falsches wie z.B. "24.1z.jj06" eingebe, dann kommt der stackoverflow!!!
Natürlich nur, wenn ich das textfeld in irgendeiner form verlasse, klar wegen dem focus!
HIER CODE BEISPIEL der KLASSE:
Code:
public class InputDateVerifier extends InputVerifier {
/**
* @param args
*/
public boolean verify(JComponent input)
{
JTextField dateField = (JTextField) input;
String dateText = dateField.getText();
boolean flag = true;
if(!StringUtils.isEmpty(dateText))
{
if (dateText.matches("\\d\\d\\x2E\\d\\d\\x2E\\d\\d\\d\\d"))
{
dateField.setText(dateText);
}
else
{
JDialog dlg = new JDialog();
JOptionPane.showMessageDialog(dlg, "Bitte geben Sie das Datum im Format tt.mm.jjjj ein", "Hinweis", JOptionPane.ERROR_MESSAGE);
System.out.println("help!");
//dateField.grabFocus();
dateField.selectAll();
flag=false;
}
}
return flag;
}
}
Watn das? Steht das nicht im Staktrace schon drinnen?
Im moment bekommt ich ja nicht mal nen staktrace!!! Er wirft mir einfach keine vernünftige ExceptioN!
DANKE
MFG
MIKE
Der Verifier wird immer dann aufgerufen wenn die Textkomponente den Fokus verliert. Du machst deine Prüfung und stellst fest - Fehler. Also JOptionPane. Dies führt dazu dass das Textfeld wieder den Fokus verliert ... und wieder und wieder und wieder ...
Der Verifier wird immer dann aufgerufen wenn die Textkomponente den Fokus verliert. Du machst deine Prüfung und stellst fest - Fehler. Also JOptionPane. Dies führt dazu dass das Textfeld wieder den Fokus verliert ... und wieder und wieder und wieder ...
Das sehe ich genauso. Deshalb bin ich auch der Meining das es ohne grabFocus funktionieren müsste.
Btw: einen JDialog zu instanzieren nur um ihn der OptionPane als Owner mitzugeben ist sinnlos.
Tracen heißt, dass du im Debug-Modus dein Programm Schritt für Schritt ausführst, um das Auftreten des Fehlers genau bestimmen zu können. Falls du Eclipse benutzt, solltest du auf eine Anweisung kurz vor dem vermuteten Fehler einen Breakpoint setzen und dann anstelle von "Run as..." "Debug as..." ausführen.
Das Programm unterbricht dann am Breakpoint, und dann kannst du mit "Step into" bzw. "Step over" Schritt für Schritt sehen, was passiert.
Tracen heißt, dass du im Debug-Modus dein Programm Schritt für Schritt ausführst, um das Auftreten des Fehlers genau bestimmen zu können. Falls du Eclipse benutzt, solltest du auf eine Anweisung kurz vor dem vermuteten Fehler einen Breakpoint setzen und dann anstelle von "Run as..." "Debug as..." ausführen.
Das Programm unterbricht dann am Breakpoint, und dann kannst du mit "Step into" bzw. "Step over" Schritt für Schritt sehen, was passiert.
Er springt immer wieder in diese verify methode rein und gleich in den else Fall? Und das immer und immer wieder! Aber nur wenn ich das JOptionPane setze!
Ist ja auch eigentlich klar. Die JOptionPane bekommt den Focus beim anzeigen -> focusLost wird aufgerufen -> JOptionPane bekommt wieder den Fokus usw...
Ich verstehe nur nicht so richtig warum das in Java5 funktionieren soll ???:L
Ist ja auch eigentlich klar. Die JOptionPane bekommt den Focus beim anzeigen -> focusLost wird aufgerufen -> JOptionPane bekommt wieder den Fokus usw...
Ich verstehe nur nicht so richtig warum das in Java5 funktionieren soll ???:L
Natürlich gibt's eine Alternative, das bringt dir aber nichts, weil du bei einem FocusLost event nichts hochpoppen lassen darfst, weil das zirkulär wird. Du kannst versuchen über ein Flag festzustellen ob du schon auf das FocusLost reagiert hast oder nicht...