Best Practice JFrame Objekt allgemein zugänglich machen

kruemelkeksfan

Aktives Mitglied
Hallo Leute,

seit ich mit GUI-Programmierung angefangen habe habe ich ein Problem, das ich nie richtig lösen konnte:

Immer wenn ich sehe, dass ein Stück Code problematisch ist, also eine Exception auslösen oder sonst dem Programm zur Laufzeit schaden könnte, lasse ich ein kleines Fenster mit einer Fehlermeldung ausgeben, die spezifiziert, wo welches Problem aufgetreten ist. Wenn diese Fehlermeldung (eine Klasse, die JFrame erweitert) "konstruiert" wird, soll sie das Hauptfenster via "dispose ()" schließen. Mein Problem ist, dass der Konstruktor dafür eine Referenz auf das Hauptfenster braucht. Da der Konstruktor von nahezu überall aus aufgerufen werden kann, heißt das in der Praxis, dass fast jedes Objekt in meinen GUI-Programmen eine Referenz auf das Fenster benötigt und als Instanzvariable speichern muss.

Diese Lösung kommt mir ziemlich hakig vor und ich wollte mal Fragen, wie ihr das Problem lösen würdet? Ich suche einen Weg, eine Referenz auf das Hauptfenster in den Konstruktor der Fehlermeldung zu bekommen, ohne überall Referenzen auf selbes in Konstruktoren übergeben zu müssen oder eine ellenlange Kette von Gettern durch meine Klassenhierarchie zu legen, nur damit das Hauptfenster im Ernstfall geschlossen werden kann. Meine Konstruktor-Parameterlisten sind schon ohne solche Späße zum Bersten gefüllt :bahnhof:

LG Max
 

Gucky

Top Contributor
Ich verstehe den Sinn hinter deiner Konstruktion nicht aber ich denke, dass du dir dabei etwas gedacht hast, weshalb ich darauf nicht eingehen werde. Aber grundsätzlich sind Exceptions Dinge, die verhindert werden sollten und wenn sie doch mal fliegen sollten sie so schnell wie möglich behandelt werden, sodass der Nutzer so wenig Unannehmlichkeiten davon hat, wie möglich.

Ich würde das über einen EventMulticaster lösen (Events sind mMn sowieso eine geniale Erfindung).
Du erstellst eine Klasse ErrorOcurredEvent, die du von EventObject ableitest. Dieses Event enthält alles, was du dem Empfänger des Events gerne mitteilen würdest.
Du erstellst ein Interface ErrorOcurredEventListener, welches du von EventListener ableitest. Dieses Interface stellt nur eine Methode bereit: errorOcurred(ErrorOcurredEvent e). Dieses Interface wird von allen Klassen implementiert, denen du mitteilen möchtest, dass ein Fehler passiert ist.
Du erstellst eine Klasse EventMulticaster, welcher ErrorOcurredEventListener implementiert. Außerdem bietet er Methoden an um Listener hinzuzufügen und zu entfernen und natürlich ein Medium um diese zu speichern. Wird auf ihn errorOcurred aufgerufen, so ruft er errorOcurred auf alle gespeicherten Listener auf. Achte dabei darauf die zu behandelnde Referenz zu übergeben und nicht einfach eine Neue zu erzeugen. Jedes Objekt, bei dem ein Fehler auftreten könnte bekommt eine Referenz von EventMulticaster. Achte dabei darauf, dass nur eine Instanz von EventMulticaster existiert.
 

kruemelkeksfan

Aktives Mitglied
Ich verstehe den Sinn hinter deiner Konstruktion nicht aber ich denke, dass du dir dabei etwas gedacht hast, weshalb ich darauf nicht eingehen werde.

Du darfst meine Konstruktion ruhig kritisieren :)
Um das nochmal präziser zu erklären: Ich arbeite gerade an einer Klassenbibliothek, die ich für andere Projekte nutzen will. Die Fehler und Exceptions, die die Fehlermeldung auslösen sollen, beziehen sich zu 99% auf irgendwelche Fälle, wo die Bibliothek falsch verwendet wird. Beispielsweise, wenn der Pfad, der auf ein Bild verweisen soll nicht korrekt ist. Ich könnte alternativ natürlich auch eine Fehlermeldung auf der Konsole ausgeben lassen, das wäre viel einfacher. Allerdings wird es dann schwierig, wenn ich beim Testen etwas übersehe und einem Endanwender dann das Programm abschmiert. Es wäre u.U. ziemlich aufwendig einem Ottonormalverbraucher zu erklären, wie er das Programm auf der Konsole startet, damit er mir die Fehlermeldung durchgeben kann. Besser er kriegt ein handliches Fenster gezeigt, in dem steht: "Yo, es ist was schiefgelaufen. Dieser Mist hier funktioniert nicht." Dann kann der Benutzer mir eine Mail schicken und ich weiß was Sache ist.

Wenn ich dich richtig verstanden habe, soll ich, statt die Fehlermeldung direkt nach dem Auftreten des Fehlers zu kontruieren, den fehlerhaften Code ein Event auslösen lassen. Der EventListener kann dann darauf reagieren und die Fehlermeldung ausgeben. Die Idee klingt gut und scheint den Nagel auf den Kopf zu treffen. Leider habe ich selbst noch nie ein Event programmiert und habe nicht ganz verstanden, worauf du mit dem Multicaster hinaus willst? Was macht der? Das Event von der Quelle zum Listener weiterleiten?
 

Gucky

Top Contributor
Dann macht die Konstruktion doch mehr Sinn.

Genau das tut er. Dann braucht zwar jedes Objekt eine Referenz auf den Multicaster aber dafür behältst du den Überblick, wer auf was eine Referenz braucht und du kannst sehr leicht Events an mehr als nur ein Objekt weiterleiten.
Der Multicaster läuft in einem eigenen Thread, damit er den Auslösenden nicht lahmlegt. Dazu solltest du dich (wenn noch nicht geschehen) mit wait und notify auseinandersetzen.

Wie man Events programmiert steht im Internet besser, als ich es erklären könnte. Bei Problemen helfe ich trotzdem gerne ;)
 

kruemelkeksfan

Aktives Mitglied
Hm, aber dann habe ich ja im Prinzip nichts gekonnt :(
Wenn ich jetzt jedem Objekt eine Multicaster-Referenz mitgebe, statt einer JFrame-Referenz, ist das vielleicht sauberer und objektorientierter, aber mein Grundproblem, dass ich eben nach Möglichkeit gar nichts mitgeben will, wird nicht gelöst.
Ich werd vermutlich einfach System.out verwenden und hoffen, dass ich meine Klassen ordentlich verwende, damit ich gar nicht erst irgendwelche Fehlermeldungen auswerfen muss.
 

Gucky

Top Contributor
Du könntest alles in ein ErrorLog umleiten und wenn das Programm abstürzt anzeigen lassen, dass das ErrorLog an dich weitergeleitet werden soll. Ich glaube, dass geht mit Hooks.
 

Gucky

Top Contributor
Mir ist noch etwas eingefallen, für den Fall, dass Hooks bei Abstürzen nicht funktionieren:
Du erstellst ein Flag (Registry, eigene Dokumente, Programmordner etc.). Dieses Flag wird bei jedem Start gesetzt und bei jedem Beenden ggf. mit einem Hook zurückgesetzt.
Ist das Flag beim Start immer noch gesetzt, so ist das Programm abgestürzt oder wurde nicht ordnungsgemäß beendet (Task Manager) und du zeigst eine entsprechende Meldung an.
 

kruemelkeksfan

Aktives Mitglied
Hm, ich glaube du denkst ziemlich kompliziert :D Aber es ist eine super Idee eine Textdatei abzuspeichern. Dann könnte ich auch versuchen die Fehlermeldungen in der Textdatei abzuspeichern und das Programm normal mit System.exit (0) zu beenden. Danke für die Anregung :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Tobero JFrame nimmt keinen Key oder Maus inputs Allgemeine Java-Themen 0
FRI3ND JFrame wird nicht angezeigt Allgemeine Java-Themen 3
N JFrame für Minispiele Allgemeine Java-Themen 14
F JFrame fü Eclipse wie? Allgemeine Java-Themen 6
4 Swing JFrame BackgroundColor Allgemeine Java-Themen 3
RalleYTN Merkwürdiger Fehler mit JFrame im Vollbild Allgemeine Java-Themen 4
snipesss Visueller Countdown in JFrame Allgemeine Java-Themen 1
K Swing OpenStreetMap in JFrame einfügen Allgemeine Java-Themen 1
S JFrame Variable mitgeben Allgemeine Java-Themen 5
F JFrame übergeben Allgemeine Java-Themen 5
B JFrame Text Ausgabe Allgemeine Java-Themen 7
T JFrame Overlay Allgemeine Java-Themen 1
I JPanel soll sich dem JFrame anpassen Allgemeine Java-Themen 1
I JFrame vor schliessen, methode auführen Allgemeine Java-Themen 2
I JFrame Icon in Main übergeben Allgemeine Java-Themen 1
? AWT Translucent JFrame mit repaint Allgemeine Java-Themen 4
S OOP JFrame als Observer eines JPanel Allgemeine Java-Themen 3
X Modalität von JDialog nachträglich in JFrame implementieren? Allgemeine Java-Themen 8
P Ableitungsfehler JFrame Allgemeine Java-Themen 5
A Excel Tabelle in JFrame darstellen Allgemeine Java-Themen 6
S JFrame an Fenstergröße anpassen Allgemeine Java-Themen 16
G JPanel in JFrame Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
E Grafiken auf dem JFrame Allgemeine Java-Themen 5
D Bilder in JFrame anzeigen Allgemeine Java-Themen 5
X Kann JLabel in JFrame nicht aktualisieren Allgemeine Java-Themen 3
J pack() lässt JFrame grau Allgemeine Java-Themen 3
J JFrame / PopUp-Menü bearbeiten Allgemeine Java-Themen 2
M JFrame absolut im Vordergrund Allgemeine Java-Themen 2
D JFrame nur in eine Richtung resizen Allgemeine Java-Themen 6
X JFrame sichtbar bei einem gesperrten Computer Allgemeine Java-Themen 11
U Zeichnen mit JFrame. Allgemeine Java-Themen 5
P JPanel - JFrame Allgemeine Java-Themen 6
N JFrame Icon selbst erzeugen Allgemeine Java-Themen 2
T applet und JFrame Allgemeine Java-Themen 12
T abspeichern und laden von objekten in JFrame Allgemeine Java-Themen 2
Developer_X JFrame verkleinern Allgemeine Java-Themen 20
D Problem mit Tooltips und JFrame (Tooltips sind zu kurz!) Allgemeine Java-Themen 4
Z Uralt-Applet in JFrame Anwendung konvertieren Allgemeine Java-Themen 12
F JFrame zeigt Hintergrund und nicht den Inhalt Allgemeine Java-Themen 12
G Bilder einer Webcam im JFrame anzeigen Allgemeine Java-Themen 5
D Von Thread auf JFrame zugreiffen? Allgemeine Java-Themen 5
M JFrame anpassen Allgemeine Java-Themen 4
M Neues JPanel in JFrame einbinden Allgemeine Java-Themen 6
W Das schließen des JFrame abfangen, wiei? Allgemeine Java-Themen 6
M PDF auf JFrame Allgemeine Java-Themen 10
D JFrame vergrößert nicht auf die gewünschte Größe Allgemeine Java-Themen 2
MQue JFrame nur einmal öffnen Allgemeine Java-Themen 3
MQue Fokus von Komponenten/JFrame Allgemeine Java-Themen 3
MQue JFrame bleibt hängen Allgemeine Java-Themen 3
P Image auf JPanel auf JFrame Allgemeine Java-Themen 3
P JPanel in JFrame Allgemeine Java-Themen 2
T Sound in JFrame: Ich krichs nich hin =( Allgemeine Java-Themen 7
E 2 Images auf einem JFrame Allgemeine Java-Themen 8
TheJavaKid Component in der Titelleiste vom JFrame? Allgemeine Java-Themen 18
G Word-Dokument in einem JFrame Allgemeine Java-Themen 2
T Servlet und JFrame Allgemeine Java-Themen 2
S JFrame mit Wartezeit Allgemeine Java-Themen 12
thE_29 Java App/JFrame Bildschirm "sperren" Allgemeine Java-Themen 10
U JFrame, JOptionPane - vor dem Schließen Benutzer fragen Allgemeine Java-Themen 10
T JFrame in Statusleiste minimieren Allgemeine Java-Themen 4
D JFrame nicht per Hand schreiben Allgemeine Java-Themen 5
G wie Klasse in JFrame "einfügen" Allgemeine Java-Themen 12
G JFrame nimmt mein Image nicht Allgemeine Java-Themen 2
S visible prob mit JFrame und JDialog Allgemeine Java-Themen 4
A JFrame-Liste Allgemeine Java-Themen 4
J JFrame Problem beim schließen Allgemeine Java-Themen 2
R java.awt.Component.setCursor() fehlt bei der JFrame doc Allgemeine Java-Themen 2
N Lwjgl 3d Objekt wird schmaler, wenn es sich dreht Allgemeine Java-Themen 0
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
A Objekt aus anderen Objekten machen Allgemeine Java-Themen 8
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
J Objekt in Bytestream umwandeln Allgemeine Java-Themen 12
J Wie kann ich von Vornherrein einen Fokus auf ein Objekt entfernen? Allgemeine Java-Themen 3
J Information von getSource() Objekt auslesen Allgemeine Java-Themen 1
Drachenbauer Wie stelle ich fest, ob ein Objekt in meinem Array vorkommt? Allgemeine Java-Themen 5
S Variable als Objekt Name Allgemeine Java-Themen 3
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
L Objekt aus Objekt-array "löschen" Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
T Objekt in Array packen Allgemeine Java-Themen 6
K Methodenaufruf mit String / String zu Objekt konvertieren Allgemeine Java-Themen 8
S Neues Objekt darstellen Allgemeine Java-Themen 4
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M Klassen Objekt weiter geben Allgemeine Java-Themen 1
B Klassen Objekt erzeugen und Konstruktor aufrufen - Welche Lösung ist besser? Allgemeine Java-Themen 2
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
D Konstruktor - jedes Objekt einzeln erzeugen - alternative? Allgemeine Java-Themen 8
S Applet Überprüfen ob ein Objekt angeklickt wurde Allgemeine Java-Themen 2
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben