[Java + JFrame] Icon des Frames funkt. nicht mehr?
Servus.
Grundlegend habe ich eigentlich nichts geändert.
Anfangs ging folgendes:
Image logo = new ImageIcon("images/logo_32.png").getImage();
(in der Klasse angegeben)
und
this.setIconImage(logo);
im Konstruktor.
Jetzt habe ich ein bisschen gewerkelt, und am Ende habe ich festgestellt, dass das Icon nicht mehr angezeigt wird.
Beide Zeilen wurden nicht verändert und befinden sich in den gleichen Orten.
Das JFrame wird immer noch gleich erstellt, lediglich hab ich ihm beim Erstellen jetzt einen Namen gegeben.
Vorher:
new NordwindTool();
Jetzt:
NordwindTool mainFrame = new NordwindTool();
Außerdem habe ich meine Dateien per
package Hauptprogramm;
zusammengeschlossen. Ordnerstruktur wie folgt:
Unten gehts mit Dateien noch weiter, inkl. der Datei, wo der gezeigte Quelltext herkommt. In "images" befinden sich die Bilder und wurden nicht verändert.
Es gibt laut Compiler keine Fehler, die Klassen sind ordentlich eingebunden, etc.
Ich verstehe wirklich nicht, warum das Icon jetzt nicht angezeigt wird, stattdessen wird das Java Logo angezeigt.
Ich habe einen ähnlichen Prozess in einer anderen Datei des Projekts, dort funktioniert das.
Wer den ganzen Quelltext sehen möchte (Warnung: In Progress) kann hier klicken.
Die Main File ist "\Coding\Hauptprogramm\NordwindTool" und wo es funktioniert ist "Login". Der Vergleich wo es noch funktioniert hat, liegt in "\Coding\Backup.."
Danke im Voraus <3
1 Antwort
Einen Grund für das Verhalten konnte ich jetzt nicht auf Anhieb entdecken. Ich würde dir einfach einmal empfehlen, das Bild als Ressource zu laden.
https://stackoverflow.com/questions/9864267/loading-image-resource
Des Weiteren würde ich die setVisible-Methode erst zum Schluss aufrufen, wenn der Frame tatsächlich vollständig bereit ist, angezeigt zu werden.
Es kann am Ausführungskontext liegen. Das heißt, das Programm aus der IDE heraus zu starten, ist bspw. anders, als wenn du die kompilierte JAR in ihrem Ordner direkt ausführst.
Beim Drüberschauen über deinen Code sind mir noch zwei Punkte aufgefallen, die ich als kritikwürdig betrachte. Ob du diese noch angehst, überlasse ich allerdings dir, denn sie durchziehen wohl das gesamte Projekt.
1) Du hast einige Attribute (ein Panel, ein CardLayout, ...) static deklariert. Es ist für mich verwunderlich, wo hierfür der Grund liegen sollte (und ich bin dem auch nicht weiter nachgegangen), doch ich vermute, dass du auf diese Weise von woanders nochmal Zugriff auf diese Objekte erlangen möchtest. Wenn dem so sein sollte, wäre es kein guter Weg, den static dient ja nicht dazu, globale Variablen wieder zu ermöglichen.
2) Du setzt öfter kein Layout und positionierst stattdessen absolut. Das ist nicht der vorhergesehene Weg von Swing, für die Positionierung gibt es eigentlich Layout Manager. Diese sorgen letztendlich auch dafür, dass die Anwendung flexibel (z.B. skalierbar) bleibt. Ein typischer Fehler, der durch absolute Positionierung zustandekommt, ist der, dass die Anwendung auf verschiedenen Bildschirmen nicht mehr bedienbar ist, weil bspw. Komponenten verdeckt werden oder sich gegenseitig überlappen.
Wenn dein Layout komplexer ist (du scheinst jedenfalls viele Komponenten zu benutzen), dann nimm dir ein Builder-Tool. IntelliJ hat bspw. einen GUI Designer integriert.
Danke für das Feedback.
- Das mit dem static liegt oft daran, dass ich klassenübergreifend auf eben diese zugreifen möchte. Bisher ist mir kein besserer Weg gelungen. Wenn das soweit fertig ist, schau ich nochmal, ob ich das ändere :)
- Daran habe ich tatsächlich nie gedacht. Ich habe nur CardLayouts benutzt, weil es ziemlich praktisch erschien. In die anderen Layouts muss ich mich mal reinlesen, werde ich in der Zukunft beachten.
Da das alles eh nur ein Schulprojekt ist, welches wir in einem Fach machen und die Anforderungen seeeeehr gering waren, bin ich mit dem Projekt schon über allen vorgegebenen Maßen. 90% der Funktionen sind selbst beigebracht, da hilft dein Feedback ungemein.
Schönen Abend nochmal und danke, dass du dir so viel Zeit nimmst <3
Leider lässt unser Lehrer auch zu Wünschen übrig, oft ist er bei meinen Fragen überfordert :D
Wir benutzen auch eine eher mäßige IDE (Java-Editor), die meinen Anforderungen mittlerweile nicht mehr gerecht wird.
Benutze jetzt IntelliJ, muss mich da aber noch reinfuchsen.
Am Anfang habe ich den GUI Designer vom Java-Editor benutzt, der stößt, gerade wenn man mehrere Panels (vor allem beim CardLayout) benutzt, an seine Grenzen.
Deswegen mittlerweile ohne GUI Designer blind!
Der Weg, um static zu vermeiden, wäre der, die Objekte, die man benötigt, via Parameter herumzureichen.
class Detective {
private Lens lens;
public Detective(Lens lens) {
this.lens = lens;
}
public void inspect() {
this.lens.zoom();
}
}
class Lens {
public void zoom() {
// ...
}
}
// when creating detective:
Lens lens = new Lens();
Detective poirot = new Detective(lens);
Vielleicht hilft dir ein Artikel über MVC zusätzlich zur Strukturierung von Swing-Projekten: https://medium.com/@ssaurel/learn-to-make-a-mvc-application-with-swing-and-java-8-3cd24cf7cb10
Was würde ich nur ohne dich tun <3 Danke dir vielmals, das hat's gebracht!
Ich frag mich nur, warum das jetzt auf einmal nur so funktioniert :D Java ist schon was Komplexes. :D
SetVisible ist auch umgestellt, danke für den Tipp!