PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java Swing] Nichts reagiert!


Monger
2006-08-09, 22:45:16
Hallo,
diesmal habe ich wirklich ein bizarres Problem, bei dem ich keine Ahnung habe wie ich es anpacken soll.

Ich hab eine Swing Anwendung in Java. Eine von JFrame abgeleitete Klasse bildet die Anwendung, ein von JPanel abgeleitetes Feld den Inhalt mit all den Buttons etc.

Das hat auch eine Zeit lang gut funktioniert. Jetzt habe ich an einigen Stellen wichtige Änderungen gemacht, und jetzt reagiert mein JPanel plötzlich nicht mehr auf Klicks! Wenn ich auf irgendein Element klicke (z.B. eine JList, oder eine JCombobox) bekommt die zwar noch den Focus und wird markiert, reagiert aber in keinster Weise. JButtons werden nicht gedrückt, JComboboxes gehen nicht auf. Es fehlt nicht nur der Listener, die Animationen z.B. für den gedrückten Button kommen erst gar nicht.

Das Menü - was ja ans JFrame geheftet ist, reagiert völlig normal, deshalb vermute ich mal, dass der Fehler irgendwo im JPanel liegen muss. Ein anderes JPanel funktioniert tadellos, also muss es irgendwas in dem Code sein. Aber es ist einiges an Code was ich da zerpflücken muss...


Ich weiß sowas erfordert hellseherische Kräfte, aber fällt jemandem vielleicht ein, was so ein Verhalten bewirken könnte? Oder kann mir jemand einen Tipp geben, wonach ich suchen könnte? Ist das ein Threadproblem? Sind mir irgendwelche Referenzen verloren gegangen?

SgtTynis
2006-08-09, 22:55:47
Bin nicht firm mit Java/Swing, aber im .NET ist sowas typisch wenn man notwendige Basisklassenaufrufe verschlampt hat.

Monger
2006-08-09, 23:04:29
Was meinst du damit? Du meinst, wenn ich den Konstruktor der Oberklasse vergessen habe?

Kabelsalat
2006-08-09, 23:16:48
Er meint, dass es i.d.R. zu Schwierigkeiten kommt, wenn man beim Überschreiben einer Methode bzw. eines Konstruktors vergisst an der richtigen Stelle den Vorfahren aufzurufen.

public override void OnInit([..])
{
base.OnInit([..]);
//do sth
}

Senior Sanchez
2006-08-10, 20:47:30
Er meint, dass es i.d.R. zu Schwierigkeiten kommt, wenn man beim Überschreiben einer Methode bzw. eines Konstruktors vergisst an der richtigen Stelle den Vorfahren aufzurufen.

public override void OnInit([..])
{
base.OnInit([..]);
//do sth
}

bzw. super-Aufrufe in Java.

Schaue da nochmal genau durch und wenn nicht, versuche mal die Anzahl der Komponenten zu verringern indem de bestimmten Code auskommentierst. Vielleicht kommste dann dem Fehler auf die Schliche.

Monger
2006-08-12, 11:49:11
Okay, ich hab den Fehler, aber oh Mann, wie peinlich...

Ich hab an einer Stelle im Panel eine Methode namens "getParent()" geschrieben. Die überschreibt aber eine bereits existierende Methode in JPanel - und dabei kommt wohl alles durcheinander.


Tja, so simpel - aber das muss man erstmal sehen. Ich musste erstmal den gesamten Code zerpflücken um darauf zu kommen.

Senior Sanchez
2006-08-12, 12:43:00
Okay, ich hab den Fehler, aber oh Mann, wie peinlich...

Ich hab an einer Stelle im Panel eine Methode namens "getParent()" geschrieben. Die überschreibt aber eine bereits existierende Methode in JPanel - und dabei kommt wohl alles durcheinander.


Tja, so simpel - aber das muss man erstmal sehen. Ich musste erstmal den gesamten Code zerpflücken um darauf zu kommen.

Solche Fehler sind echt mies und das kenne ich auch zur genüge ;)

Aber ich glaube da hilft es einfach Quelltextkommentare einzubauen. Ich glaube IDEA und auch Eclipse machen das so, dass wenn du per Shortcut Javadoc Kommentare für die Methode einfügst, eine Annotation @Override eingefügt wird. Das hilft einem zumindest zu sehen, dass da etwas überschrieben wurde, ansonsten bekommt man es ja leider nicht mit.

Monger
2006-08-12, 14:53:25
Das hilft einem zumindest zu sehen, dass da etwas überschrieben wurde, ansonsten bekommt man es ja leider nicht mit.

In Eclipse wird zusätzlich an der linken Seite so ein Dreieck eingeblendet, dass einem per Tooltip dann auch erklärt was los ist. Die Annotations sind natürlich besser, aber die kommen ja nur, wenn man explizit eine Methode überschreibt - und nicht so wie ich einfach eine Methode zufällig genauso nennt.

Aber ich war halt völlig auf dem falschen Dampfer. Ich hab bis zum Schluss auf irgendein Layout Problem getippt. Naja, aus Schaden wird man klug.

Abnaxos
2006-08-12, 15:14:27
Okay, ich hab den Fehler, aber oh Mann, wie peinlich...

Ich hab an einer Stelle im Panel eine Methode namens "getParent()" geschrieben. Die überschreibt aber eine bereits existierende Methode in JPanel - und dabei kommt wohl alles durcheinander.
Solche Fehler zu vermeiden ist in Java5 ja bereits angedacht und z.B. von IDEA unterstützt. Da gibt es die @Override-Annotation, die man setzen sollte, um zu markieren, dass man gerade bewusst eine Methode überschreibt. Wenn man das durchzieht, kann man sich daraufhin von der IDE oder vom Compiler warnen lassen, wenn man eine Methode überschreibt, ohne @Override gesetzt zu haben (javac unterstützt das leider noch nicht). Das umgekehrte ist sogar Pflicht:
If a method is annotated with this annotation type but does not override a superclass method, compilers are required to generate an error message.

Senior Sanchez
2006-08-13, 01:08:22
In Eclipse wird zusätzlich an der linken Seite so ein Dreieck eingeblendet, dass einem per Tooltip dann auch erklärt was los ist. Die Annotations sind natürlich besser, aber die kommen ja nur, wenn man explizit eine Methode überschreibt - und nicht so wie ich einfach eine Methode zufällig genauso nennt.

Aber ich war halt völlig auf dem falschen Dampfer. Ich hab bis zum Schluss auf irgendein Layout Problem getippt. Naja, aus Schaden wird man klug.

Höh?

Wenn ich jetzt meine Methode einfach getParent nenne, die gleiche Signatur wie die Oberklasse habe und dann das Javadoc-Grundgerüst einbauen lasse, dann hängt er automatisch ein @Override rein.

@Abnaxos

Das ist natürlich ne coole Sache. Muss ich mal schauen, ob ich das durchziehen kann. Kannste mir spontan sagen wo die Option bei IDEA dafür ist?

Abnaxos
2006-08-13, 11:42:57
Die Option ist unter den Inspections zu finden, also: Settings => IDE => Errors => Class Structure => Missing @Override Annotation. Leider wird das @Override (noch) nicht automatisch gesetzt, wenn man mit Alt-Insert => Override Methods eine Methode überschreibt.

Senior Sanchez
2006-08-13, 12:26:46
Die Option ist unter den Inspections zu finden, also: Settings => IDE => Errors => Class Structure => Missing @Override Annotation. Leider wird das @Override (noch) nicht automatisch gesetzt, wenn man mit Alt-Insert => Override Methods eine Methode überschreibt.

Hey, danke :)

Weißt du zufällig wo ich noch ich sag mal Shortcuts hinterlegen kann?

Z.b. ists beim JBuilder so, dass wenn ich out eintippe und dann STRG+J drücke, er automatisch System.out.println(); draus macht. Eclipse kann das genauso wenn man sysout eintippt und STRG + Space drückt.

Das kann doch bestimmt auch IDEA, oder? *g* Ich habe leider bisher nur keine Option dafür gefunden.

Abnaxos
2006-08-13, 12:42:09
OK, jetzt werden wir aber schwer off-topic ... :biggrin:

In der Default-Konfiguration erreichst du dein Beispiel mit sout<TAB>.

Das Stichwort hierzu lautet Live-Templates, also einfach den Settings-Dialog aufmachen, zu den Live-Templates navigieren, dort den Help-Button drücken und lesen. :)

Senior Sanchez
2006-08-13, 12:44:18
OK, jetzt werden wir aber schwer off-topic ... :biggrin:

In der Default-Konfiguration erreichst du dein Beispiel mit sout<TAB>.

Das Stichwort hierzu lautet Live-Templates, also einfach den Settings-Dialog aufmachen, zu den Live-Templates navigieren, dort den Help-Button drücken und lesen. :)

Tut mir leid, wegen OT aber ich glaube so schnell finde ich sonst nicht die Antworten auf meine Fragen, als wenn ich dich fragen würde.

Das nächste Mal kann ich ja ne pn schreiben, sofern ich dir damit nich auf die Nerven gehe.

Aber danke für den Tipp mit den Live-Templates.

HellHorse
2006-08-13, 12:54:37
Leider wird das @Override (noch) nicht automatisch gesetzt, wenn man mit Alt-Insert => Override Methods eine Methode überschreibt.
Java => Code Style => "Add '@Override' annotation for new overriding methods" oder meinst du was anderes?

Abnaxos
2006-08-13, 13:11:59
Klingt gut. Allerdings finde ich die Option bei mir nicht. Verwendest du die EAP oder bin ich blind?

Vielleicht sollten wir mal einen IDEA-Tips-Thread eröffnen ... :) Wobei, diese Diskussionen entstehen aus der Situation, ein solcher Thread wäre wohl zum Tode verurteilt.

Senior Sanchez
2006-08-13, 13:34:09
Klingt gut. Allerdings finde ich die Option bei mir nicht. Verwendest du die EAP oder bin ich blind?

Vielleicht sollten wir mal einen IDEA-Tips-Thread eröffnen ... :) Wobei, diese Diskussionen entstehen aus der Situation, ein solcher Thread wäre wohl zum Tode verurteilt.

[X] Dafür!

Also ich fände so einen Thread klasse wo halt irgendwelche Tips geposted werden können. IDEA ist ja extrem mächtig und für mich als Einsteiger oft noch unüberschaubar. Da wären Tipps&Tricks doch echt mal praktisch.

Wegen der @Override-Annotation.
Ich sehe auch nur eine "Insert @Override"-Checkbox wenn man über Alt-Insert > Override Method eine Methode überschreiben will. Aber den Automatismus habe ich noch nicht entdeckt.

HellHorse
2006-08-13, 15:04:19
Klingt gut. Allerdings finde ich die Option bei mir nicht. Verwendest du die EAP oder bin ich blind?
Sorry, das war böse, gehypte IDE nicht IDEA.