[Java + JFrame] Icon des Frames funkt. nicht mehr?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

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.


KriegerMan 
Beitragsersteller
 16.11.2019, 17:52

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!

0
regex9  16.11.2019, 18:23
@KriegerMan

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.

1
KriegerMan 
Beitragsersteller
 16.11.2019, 18:48
@regex9

Danke für das Feedback.

  1. 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 :)
  2. 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

0
KriegerMan 
Beitragsersteller
 16.11.2019, 18:52
@KriegerMan

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!

0
regex9  16.11.2019, 19:14
@KriegerMan

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

1