Objekt von einem Window erstellen?

Hallo,
ich möchte eine Anwendung Programmieren die mehrere Buttons haben soll und wenn man ein Button drückt „springt“ man auf eine andere Seite. Das habe ich soweit gemacht, nun möchte ich aber dass jede Seite die selbe Größe und Hintergrundbeleuchtung haben soll. Da dachte ich, könnte ich eine Klasse machen mit einem „Grundwindow“, dieses Window sollte nur das besetzten was alle anderen Windows auch haben sollten (also hauptsächlich eine bestimmte Größe und eben ein bestimmtes Hintergrundbild) und von dieser Klasse würde ich für die anderen Klassen ein Objekt erstellen um so in allen Windows das selbe Bild zu haben. Das mit dem Objekt ist deshalb wichtig, weil ich wahrscheinlich das Hintergrundbild ab und zu ändern werde und ich nicht in jeder Klasse dann den Pfad ändern möchte.
Versteht ihr was ich meine und könnt ihr mir bitte weiterhelfen?
Oder gibt es so eine Möglichkeit nicht und muss ich tatsächlich in jeder Klasse den Pfad ändern? :(
Danke im Voraus
Alex
 
K

kneitzel

Ja, der Ansatz hört sich soweit korrekt an.

Wenn man aber im Kopf behält, dass Composition besser ist als Inheritance (Also nicht von JFrame ableiten sondern in der Klasse ist dann ein JFrame, siehe z.B. https://de.m.wikipedia.org/wiki/Komposition_an_Stelle_von_Vererbung aber es gibt sehr viel mehr...), dann kommt hier ggf. auch das Strategie Pattern in Frage, d.h. der Algorithmus wird ausgelagert und kann dann von vielen verwendet werden. Aber das muss man nicht 1:1 komplett so abbilden. Hier kann man viele Ansätze nehmen wie z.B. tatsächlich eine Klasse, die JFrame so erweitert, dass es ein bestimmtes Verhalten hinzu bekommt ( Hintergrundbild, bestimmte andere Aspekte) und die dazu z.B. eine Art Konfigurationsobjekt bekommt. Das wäre dann sowas wie ein Style oder Theme. Und dann kannst du halt ein Theme haben und dies bei allen Fenstern verwenden.... (Was in etwa dem Strategie Pattern entsprich es könnte, so da halt nicht nur Konfigurationswerte sondern auch Algorithmen vorhanden sind. Was mir evtl. besser gefällt sonst landest Du schnell dabei, alle Swing Klassen abzuleiten, was evtl. zumindest teilweise unnötig sein dürfte.)
 
@Alex128 Ich weiß nicht, ob ich Dich richtig verstehe, aber für mich hört es sich so an, dass Du eigentlich nur eine Klasse brauchst, die JPanel um das (natürlich konfigurierbare) Hintergrundbild erweitert. Der Rest ist Konfiguration und die lässt sich z. B. mittels Factories und Builder erledigen.
 
Ja, der Ansatz hört sich soweit korrekt an.

Wenn man aber im Kopf behält, dass Composition besser ist als Inheritance (Also nicht von JFrame ableiten sondern in der Klasse ist dann ein JFrame, siehe z.B. https://de.m.wikipedia.org/wiki/Komposition_an_Stelle_von_Vererbung aber es gibt sehr viel mehr...), dann kommt hier ggf. auch das Strategie Pattern in Frage, d.h. der Algorithmus wird ausgelagert und kann dann von vielen verwendet werden. Aber das muss man nicht 1:1 komplett so abbilden. Hier kann man viele Ansätze nehmen wie z.B. tatsächlich eine Klasse, die JFrame so erweitert, dass es ein bestimmtes Verhalten hinzu bekommt ( Hintergrundbild, bestimmte andere Aspekte) und die dazu z.B. eine Art Konfigurationsobjekt bekommt. Das wäre dann sowas wie ein Style oder Theme. Und dann kannst du halt ein Theme haben und dies bei allen Fenstern verwenden.... (Was in etwa dem Strategie Pattern entsprich es könnte, so da halt nicht nur Konfigurationswerte sondern auch Algorithmen vorhanden sind. Was mir evtl. besser gefällt sonst landest Du schnell dabei, alle Swing Klassen abzuleiten, was evtl. zumindest teilweise unnötig sein dürfte.)
Danke für die ausführliche Antwort, leider habe ich die Hälfte nicht verstanden weil ich noch ziemlicher Anfänger bin aber trotzdem danke
 
@Alex128 Ich weiß nicht, ob ich Dich richtig verstehe, aber für mich hört es sich so an, dass Du eigentlich nur eine Klasse brauchst, die JPanel um das (natürlich konfigurierbare) Hintergrundbild erweitert. Der Rest ist Konfiguration und die lässt sich z. B. mittels Factories und Builder erledigen.
Auch dir danke, aber ehrlich gesagt weiß ich nicht was Factories sind (bin eigentlich noch Anfänger)
 
K

kneitzel

Also ich versuche einmal, das eine oder andere verständlicher auszudrücken.

-> Zum einen werden sehr gerne sogenannte (Design) Pattern (auf Deutsch Entwurfsmuster) heran gezogen. Das sind dann Überlegungen, wie etwas prinzipiell entwickelt werden kann. Ich würde Dir prinzipiell empfehlen, Dir dies auch einmal anzusehen.
In diesem Zusammenhang hört man auch gerne "GoF" - Group of Four - Der Anfang in dem Bereich wurde durch eine Gruppe von 4 Personen gemacht, die ein erstes Buch veröffentlicht haben und die so zu gewissem Ruhm gekommen sind. Das Buch "Design Patterns: Elements of Reusable Object-Oriented Software" ist immer noch mit das Werk, aber das Buch, welches ich empfehlen würde, wäre "Head First Design Pattern" (Übersetzte Ausgabe ist "Entwurfsmuster von Kopf bis Fuß", weil dies für Anfänger deutlich besser geschrieben ist.
Mit dem Wissen aus so einem Buch sind dann Aussagen deutlich besser Verständlich, weil dann die Pattern, die angesprochen werden, bekannt sind.


-> Composition (Eine Klasse beinhaltet eine Instanz einer anderen Klasse) vs. Inheritance (Eine Klasse ist von einer anderen abgeleitet): Ersteres ist eine "hat ein" Beziehung. Letzteres ist eine "ist ein" Beziehung. Wenn Du nun eine Klasse von JFrame ableitest, dann ist die Frage tatsächlich: Ist das, was Du da schreibst, wirklich ein JFrame mit erweiterter Funktionalität oder ist es lediglich eine "Hat ein" Beziehung? Wenn Du eine Applikation schreibst, dann ist diese Applikation kein JFrame, sondern es hat zur Anzeige lediglich ein JFrame.

-> Zu Deiner Thematik: Es ist richtig, dass Du Code nicht wiederholen solltest. Vorteil ist ganz klar: Du musst bei Änderungen nicht an mehreren Stellen etwas ändern. Und da gibt es ganz grob gesagt mehrere Lösungen und Ideen.

a) Inheritance nutzen: Du hast Klassen, die eine gleiche Oberklasse haben und die Verhalten teilen. Beispiel hier ist: Katze abgeleitet von Lebewesen, Hund abgeleitet von Lebewesen. Nun hast Du ein Verhalten, dass bei beiden gleich ist: Sie Säugen ihren Nachwuchs. Dieses Verhalten kann man dann in eine Klasse "Säugetier" packen, welche von Lebewesen erbt und Katze und Hund erben dann von Säugetier. => Dies setzt aber dann voraus, dass Du sagen kannst: Ein Hund ist ein Säugetier, eine Katze ist ein Säugetier.

b) Code separieren. Evtl. gehört der Code nicht in die Klasse selbst. Nehmen wir fliegende Dinge. Natürlich kann ein Vogel fliegen, ein Hubschrauber kann fliegen, ein Flugzeug kann fliegen, ... Somit gehört dies evtl. nicht in den Vogel oder in den Hubschrauber, sondern es kann separiert werden. Dann hat man eine Klasse Flugverhalten oder so.
Somit könnte man hingehen und sich eine Klasse Theme bauen, welches für das Aussehen verantwortlich ist. Da ist dann an einer Stelle der Code, der benötigt wird und Du hast dann im Theme evtl. eine Methode applyTheme(JFrame), welches dann das definierte Theme auf das JFrame anwendet.

c) Oder die angesprochene Factory: Statt selbst ein JFrame mit new JFrame() zu erzeugen, hast du eine Factory für deine JFrames. Die Factory hat dann ein createNewWindow() oder so, das ein JFrame zurück gibt. Dann hast Du wieder nur eine Stelle, an der Du den Code anpassen musst.

War das etwas besser verständlich? Konnte ich Dir den Überblick geben?

Viele Grüße,

Konrad
 
Also ich versuche einmal, das eine oder andere verständlicher auszudrücken.

-> Zum einen werden sehr gerne sogenannte (Design) Pattern (auf Deutsch Entwurfsmuster) heran gezogen. Das sind dann Überlegungen, wie etwas prinzipiell entwickelt werden kann. Ich würde Dir prinzipiell empfehlen, Dir dies auch einmal anzusehen.
In diesem Zusammenhang hört man auch gerne "GoF" - Group of Four - Der Anfang in dem Bereich wurde durch eine Gruppe von 4 Personen gemacht, die ein erstes Buch veröffentlicht haben und die so zu gewissem Ruhm gekommen sind. Das Buch "Design Patterns: Elements of Reusable Object-Oriented Software" ist immer noch mit das Werk, aber das Buch, welches ich empfehlen würde, wäre "Head First Design Pattern" (Übersetzte Ausgabe ist "Entwurfsmuster von Kopf bis Fuß", weil dies für Anfänger deutlich besser geschrieben ist.
Mit dem Wissen aus so einem Buch sind dann Aussagen deutlich besser Verständlich, weil dann die Pattern, die angesprochen werden, bekannt sind.


-> Composition (Eine Klasse beinhaltet eine Instanz einer anderen Klasse) vs. Inheritance (Eine Klasse ist von einer anderen abgeleitet): Ersteres ist eine "hat ein" Beziehung. Letzteres ist eine "ist ein" Beziehung. Wenn Du nun eine Klasse von JFrame ableitest, dann ist die Frage tatsächlich: Ist das, was Du da schreibst, wirklich ein JFrame mit erweiterter Funktionalität oder ist es lediglich eine "Hat ein" Beziehung? Wenn Du eine Applikation schreibst, dann ist diese Applikation kein JFrame, sondern es hat zur Anzeige lediglich ein JFrame.

-> Zu Deiner Thematik: Es ist richtig, dass Du Code nicht wiederholen solltest. Vorteil ist ganz klar: Du musst bei Änderungen nicht an mehreren Stellen etwas ändern. Und da gibt es ganz grob gesagt mehrere Lösungen und Ideen.

a) Inheritance nutzen: Du hast Klassen, die eine gleiche Oberklasse haben und die Verhalten teilen. Beispiel hier ist: Katze abgeleitet von Lebewesen, Hund abgeleitet von Lebewesen. Nun hast Du ein Verhalten, dass bei beiden gleich ist: Sie Säugen ihren Nachwuchs. Dieses Verhalten kann man dann in eine Klasse "Säugetier" packen, welche von Lebewesen erbt und Katze und Hund erben dann von Säugetier. => Dies setzt aber dann voraus, dass Du sagen kannst: Ein Hund ist ein Säugetier, eine Katze ist ein Säugetier.

b) Code separieren. Evtl. gehört der Code nicht in die Klasse selbst. Nehmen wir fliegende Dinge. Natürlich kann ein Vogel fliegen, ein Hubschrauber kann fliegen, ein Flugzeug kann fliegen, ... Somit gehört dies evtl. nicht in den Vogel oder in den Hubschrauber, sondern es kann separiert werden. Dann hat man eine Klasse Flugverhalten oder so.
Somit könnte man hingehen und sich eine Klasse Theme bauen, welches für das Aussehen verantwortlich ist. Da ist dann an einer Stelle der Code, der benötigt wird und Du hast dann im Theme evtl. eine Methode applyTheme(JFrame), welches dann das definierte Theme auf das JFrame anwendet.

c) Oder die angesprochene Factory: Statt selbst ein JFrame mit new JFrame() zu erzeugen, hast du eine Factory für deine JFrames. Die Factory hat dann ein createNewWindow() oder so, das ein JFrame zurück gibt. Dann hast Du wieder nur eine Stelle, an der Du den Code anpassen musst.

War das etwas besser verständlich? Konnte ich Dir den Überblick geben?

Viele Grüße,

Konrad
Wow! Vielen Dank Konrad! War super ausführlich und verständlich!
Ich werde mich da noch bisschen informieren (an der Stelle auch Danke für den Buchtipp!)
Bist wohl ein sehr erfahrener und guter Programmierer! Ich könnte viel von dir lernen! Darf ich fragen ob du „nur“ in Java programmierst oder auch andere Sprachen beherrscht?
 
Darf ich fragen ob du „nur“ in Java programmierst oder auch andere Sprachen beherrscht?
Ich denke, die wenigsten, die beruflich mit Softwareentwicklung zu tun haben, werden nur eine Sprache "sprechen", denn die ist zunächst einmal nebensächlich. Es müssen konkrete Probleme gelöst werden und je nachdem, um welches Problem es geht, wählt man auch eine passende Sprache. Die Wahl hängt wiederum von verschiedenen Faktoren ab. Neben technischen Erfordernissen werden selbstverständlich auch vorhandene Kenntnisse berücksichtigt.

Um eine neue Sprache anwenden zu können, braucht man lediglich ein paar Stunden. Nach ein paar Tagen Übung hat man die Syntax und ein paar "Grundfunktionen" in der Regel drauf. Aber: jedes "System" hat seine Eigenheiten und bis man die kennt, vergeht einiges an Zeit - und Erfahrung sammelt man auch nach zig Jahren noch.
 
K

kneitzel

Ich denke, die wenigsten, die beruflich mit Softwareentwicklung zu tun haben, werden nur eine Sprache "sprechen", denn die ist zunächst einmal nebensächlich. Es müssen konkrete Probleme gelöst werden und je nachdem, um welches Problem es geht, wählt man auch eine passende Sprache. Die Wahl hängt wiederum von verschiedenen Faktoren ab. Neben technischen Erfordernissen werden selbstverständlich auch vorhandene Kenntnisse berücksichtigt.

Um eine neue Sprache anwenden zu können, braucht man lediglich ein paar Stunden. Nach ein paar Tagen Übung hat man die Syntax und ein paar "Grundfunktionen" in der Regel drauf. Aber: jedes "System" hat seine Eigenheiten und bis man die kennt, vergeht einiges an Zeit - und Erfahrung sammelt man auch nach zig Jahren noch.
Also auf Grund meiner Berufserfahrung kenne ich viele Sprachen: Angefangen mit Pascal und C um dann auch C++ zu machen, als das raus gekommen ist ... Visual Basic ist auch nicht an mir vorbei gegangen. Als Java raus gekommen ist, wurde Java auch im Detail begutachtet.... 2003 der Wechsel zu C# und beruflich war ich ab da vor allem in C# unterwegs.

Eine Sprache zu lernen geht sehr schnell. Aber aus meiner Sicht gehört aber eben deutlich mehr dazu, um wirklich als Software Entwickler arbeiten zu können:
Das ‚Ecosystem‘ ist wichtig und das muss man kennen. Das ist in der Regel extrem umfangreich. Bei Java ist da neben dem Framework die vielen ‚üblichen Verdächtigen‘: JEE mit entsprechenden Implementierungen / Erweiterungen kommen einem da gleich in den Sinn...
Bei .Net sieht die Welt anders aus, da hat man dann keinen Application Server sondern ist schon damals Richtung Microservices gegangen (als diese Kuh noch nicht durchs Dorf getrieben wurde). Dafür gibt es dann andere Libraries: WCF war zum Beispiel viel bei uns im Einsatz aber natürlich auch ASP.Net (lange ohne Microsofts MVC, das hatten wir in einer eigenen Lib vor Microsoft)....
Umsteiger oder Leute, die beides machen, sind mir oft etwas suspekt, Das liegt einfach daran, dass diese Leute oft Technologien/Libs aus dem anderen Bereich nutzen wollen. Logging in .Net? Log4net kommt dann zum Einsatz weil man log4j ja schon kannte und so. Nur eben hat das .Net Framework das schon alles drin (TraceSource/TraceListener) so dass es einfach unnötig ist....
Aber man kann da viel machen. Ich selbst habe Java lange nur privat für mich genutzt (Bin halt auch viel auf Mac und Unix unterwegs und da war .Net lange nicht verfügbar so man von Mono mal absieht). Aber da habe ich dann auch immer sehr viel Zeit drauf verwendet, eben den ‚Java Weg‘ zu erkennen und zu gehen und nicht gewisse Dinge aus der anderen Welt mit zu nehmen ....

Und aus meiner Sicht sollte man sich nicht überladen: Man kann .Net und Java gleichzeitig machen, ja. Aber das ist eine zusätzliche Belastung, Aber die Entwicklung geht rasant voran und man kommt aus dem Lernen nie heraus. Was will man denn alle abdeckende?
- Vorgehensweisen -> Gib mir unsere jährliche Kuh, so wie wir geben unseren Managern neue Buzzwords. Da kommt man im beruflichen Bereich kaum dran vorbei...
- Technische Entwicklungen im Umfeld: Datenbanken sind hier zu nennen, aber auch die Laufzeitumgebungen (z.B. Container oder Cloud)
- Sprachentwicklung: ständig kommt was Neues. Und das muss man kennen. Bei .Net geht es jetzt z.B. los, dass man sich vom Bytecode verabschiedet und man doch bitte Dinge direkt für die CPU übersetzen soll und so. Aber die Bedeutung von .Net nimmt auch ab - Microsoft scheint sich verstärkt auch wieder C++ zuzuwenden. Das muss man alles können.

Also ich versuche mich, auf eine Sprache zu konzentrieren. Daher gab es beruflich auch einen Wechsel hin zu Java (aber auch mit Anteil C++). Und ich würde jedem empfehlen, sich ebenfalls auf eine Sprache zu konzentrieren. Gerade am Anfang hat men ehh mehr als genug zu lernen. Und man sollte zusehen, dass man etwas meistert. Ist nicht immer leicht, aber das ist in meinen Augen wichtig. Also am Anfang eher mal beschränken: also wenn man noch generelle Probleme hat, überhaupt etwas Code zu schreiben, dann lässt man erst einmal die GUI weg. Wenn man im Java Bereich noch nicht drin ist: was will man dann noch x weitere Hochzeiten haben, auf denen man tanzen will? (Also noch die iOS Applikation in Swift oder so?) Da sollte man auch realistisch sein und bleiben. Also immer das Gleiche: Die Klöße isst man einen nach dem anderen. Bei der Entwicklung eines Produktes entwickelt man ein Feature nach dem anderen, .... also nicht verzetteln!

Das wäre so meine Sichtweise und mein Senf zu diesem Thema,
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben