Lieber von JFrame erben?

D

DerAlk

Gast
Hallo,

ich würde gerne wissen, welche Vorteile das erben von der Klasse JFrame hat.
Persönlich schöner finde ich es nämlich, wenn man ein JFrame erzeugt und diesem dann die Komponenten hinzufügt.
Was meint ihr bzw. wie macht ihr es?
 

thE_29

Top Contributor
In meiner Schulzeit wurde auch immer davon abgeraten von JFrame zu erben..

Der alte Prof. hatte aber die Eigenart dann die Klasse von JPanel (=mainpanel) erben zu lassen und dort halt dann drauf die Komponenten zu adden und das ganze dann aufs JFrame..

Ob das jetzt soviel mehr Sinn hatte.. Man könnte halt in die paint-Methoden oder sonstigen eingreifen, aber tjo.. Wenn mans nicht braucht, hats nicht wirklich Vorteile..
 
D

DerAlk

Gast
Vielen Dank für die schnellen Einschätzungen.
Habe hier nämlich gerade ein Buch vor mir liegen, wo das so gemacht wird. Aber dann möchte ich mir das gar nicht erst angewöhnen.
 
G

Gast2

Gast
Klar, du kannst nur von einer Klasse erben. Wenn du also schon von JFrame erbst hast du keine Möglichkeit mehr von ner anderen Klasse zu erben.
Man sollte imho Komposition immer der Vererbung vorziehen, falls man nicht unbedingt das Verhalten der Klasse ändern bzw. erweitern will.

Von JFrame erben macht mMn nie sinn. Von JPanel eigentlich nur wenn man die paintComponent Methode überschreiben will.
 
S

SlaterB

Gast
wer will schon je in einer JFrame-Klasse von etwas anderem erben?
oder selbst wenn ist es immer leicht umzubauen und spätestens bei der zweiten Vererbung hätte man dasselbe Problem, nix gewonnen,
zweimal Vererbung klingt komisch? genauso auch nur eine Vererbung bei JFrame..

das ist bisschen unsauber aber einfach nur eine Kleinigkeit, macht 1-x frame.xy()-Aufrufe leichter,
JFrames hat man üblicherweise nur 1x oder wenn dann je JFrame eine Klasse die sich darum kümmert, die nach außen gerne auch wie ein JFrame aussehen darf um z.B. setVisible(true) aufzurufen,
genauso mehrere JPanel-Klassen für größere Sub-Strukturen

Java:
SubPanelXy a = new SubPanelXy();
add(a);
schreibt sich schöner als
Java:
SubPanelXy a = new SubPanelXy();
this.frame.add(a.getPanel());

immer eine Gratwanderung, an anderen Stellen würde ich auch nicht etwa von ArrayList erben,
aber in GUIs ist das schon ziemlich handlich und übersichtlich
 
G

Gelöschtes Mitglied 20545

Gast
Vielleicht kann man das Risiko, Methoden versehentlich zu überschreiben, als Nachteil sehen.
Und: Wie ist das mit Threads? Wenn JFrame nicht threadsicher ist, wie ist es dann mit Threads, die in dem Objekt erzeugt werden? (Vielleicht offenbart die Fragestellung schon, dass ich mich damit nicht auskenne, is nur so'n Gedanke ^^ )
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
im Grunde exakt dasselbe aus meiner Sicht, wobei ich persönlich so gut wie nie irgendeine Thread-Methode brauche, dann geht Runnable,
wenn man aber interrupt(), join(), isAlive() usw. abfragen will und eine Klasse hat die 'für diesen Thread' steht, also normalerweise eh von nichts zu erben hat, dann könnte diese von Thread erben, statt den Thread extra in einem Attribut stehen zu haben
 

Marco13

Top Contributor
Die Frage nach Threads ist eigentlich orthogonal dazu. Ein "hartes" Gegenargument kann ich spontan nicht nennen, aber ... was sollte in einer Klasse stehen, damit sie von JFrame erben muss? Oder damit es einen Vorteil bringt? Für welches "X" gilt "X ist ein JFrame"?
Grenzfälle könnte es geben, wenn man z.B. eine komplizierte Toolbar einbauen will oder viel mit anderen JFrame-eigenen Methoden rumhantiert oder so, aber auch das ist kein echter Grund. Und wenn es keinen driftigen Grund gibt, sollte man nicht Vererben.
 

André Uhres

Top Contributor
Ehe Swing eingeführt wurde, machte es keinen Sinn von "Frame" zu erben. Jetzt erbt "JFrame" von "Frame" und inzwischen sogar "JXFrame" von "JFrame" (SwingX library). Es macht offenbar nur Sinn, wenn Du eine grundlegende und allgemein gültige Idee hast, wie Du einen Frame noch intelligenter machen kannst als eine bestehende Klasse.

Gruß,
André
 
S

SlaterB

Gast
wozu wird überhaupt ein Objekt der Klasse HalloWelt erstellt, könnten doch alle Befehle in der main-Methode stehen..

das letzte Programm auf der Seite zeigt, wie 3/4 der Befehle ohne die Vererbung noch komplizierter wären
Java:
public class HalloWelt extends JFrame{

  JLabel schriftZug;

  public HalloWelt(String titel){
     super(titel); // *, ok, super ist vielleicht noch ungewöhlicher als JFrame-Konstruktor-Aufruf
     setDefaultCloseOperation(EXIT_ON_CLOSE); // *, 2x, auch für die Konstante
     setSize(300, 300); // *
     Container cp = getContentPane(); // *
     cp.setLayout(new BorderLayout());
     
     schriftZug = new JLabel("HalloWelt");  
     cp.add(schriftZug,BorderLayout.NORTH); // *

     setVisible(true); // *

  }
  public static void main(String[] args){
     new HalloWelt("Ich bin ein JFrame-Objekt");
  }
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
meine Meinung stand im Posting von 15:37: nicht notwendig, "aber in GUIs ist das schon ziemlich handlich und übersichtlich",
wenn ich mich zu "sinnvoll" ja oder nein entscheiden muss: ja ;)
 
S

SlaterB

Gast
und wenn man die paintComponent eines JPanels überschreibt, dann ist es ok?
dann nutzt man gleich eine eigene Klasse auch für Aufrufe wie setBackground(), setPreferredSize() usw?
das ist doch auch nicht konsequent, dort könnte man doch genauso ein JPanel-Attribut verwenden:
Java:
class CompPanel {
   JPanel p; 
  
    p.add(..);
    p.add(..);
}

class PaintPanel {
   JPanel p = new JPanel() {
           paintCompoent() {
                ...
           }
    }; 
  
    p.set(..);
}
dagegen finde ich Erben in beiden Fällen ehrlicher und einheitlicher
 
B

bygones

Gast
stimme Andre zu. Vererbung aufgrund von Faulheit zu nehmen ist unsinnig und kontraproduktiv. Nur weil man setSize statt frame.setSize schreiben will Vererbung zu nehmen ist falsch.
 
S

SlaterB

Gast
klar, um Vererbung kommt man nicht drumherum, ich frage mich dabei, ob ihr das dann auch wie im Beispiel PaintPanel wieder per Attribut lösen würdet?
denn das Überschreiben bedeutet ja nicht, dass sonstiger Initialisierungs-Code auch in die neue JPanel-Subklasse gehört,
wenn aber doch dann ist die Einheitlichkeit schon ein einigermaßen bedeutender Grund, z.B. in der Außensicht wie vorher angesprochen:

auf höherer Ebene steht
Java:
add(getPaintPanel()); // geht direkt weil PaintPanel von JPanel erbt für paintComponent
add(getCompPanel().getPanel()); // geht nicht direkt weil Vererbung vermieden wurde
? das wäre doch schrecklich

als Alternativen bleibt nur
- PaintPanel und CompPanel erben beide nicht von JPanel, umständliche Konstruktion für paintComponent, siehe vorheriges Posting
- oder beide erben von JPanel, ganz normaler Standard, eine Klasse die Panel heißt darf auch ruhig ein JPanel sein (!)

wie ist die Wahl, Mischen, nie die eigenen Klassen erben lassen (sondern höchstens JPanel-Attribut) oder immer erben?

schade dass es nicht wirklich große Beispiel-GUIs mit extra Klassen für Unterpanel gibt, oder kennt jemand welche, vielleicht eigene? ;)
Using Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
benutzt Vererbung, gilt aber vielleicht nicht als positives Beispiel


----

bei welchen anderen Klassen steht diese Entscheidung noch an?
bei Collections lohnt allein schon nicht wegen theoretischer Wahl unterschiedlicher Implementierungen,
Thread ist bekannt,

Applet macht es eher leicht weil Methoden zu implementieren sind, strenggenommen gilt aber dasselbe wie bei JPanel,
der Umstand wird auch gerne für alles andere genutzt, inkonsequent,
hier ein Beispiel dann auch mal wieder mit erbenden JPanel,
Learning Java - Chapter 7 : Java

von Socket/ ServerSocket würde niemand erben, da sind die Vorlagen/ der Gebrauch sicher richtiger,
viel mehr fällt mir kaum ein ;)
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
stimme Andre zu. Vererbung aufgrund von Faulheit zu nehmen ist unsinnig und kontraproduktiv. Nur weil man setSize statt frame.setSize schreiben will Vererbung zu nehmen ist falsch.
Hmm, also ich hatte das zu Anfang so gelernt bzw. beigebracht bekommen. Und bei mir hat das eigentlich auch nichts mit Faulheit zu tun, sondern ich finde es eigentlich übersichtlicher, wenn mein Hauptframe in einer eigenen Klasse steht und diese Klasse dann auch ein JFrame sein kann (weil es ja auch einer ist). Warum nicht. Dachte ich jedenfalls bisher immer. In meinem Hauptframe passiert ja eigentlich auch nicht so richtig viel: Titel, Grösse, Position auf dem Bildschirm, Menü, Toolbar, Statusleiste und dann das MainPanel in den CENTER-Bereich. Ich brauche also auch nicht die Möglichkeit, evtl. noch von einer anderen Klasse erben zu müssen.

Bisher hatte ich eine Startklasse (mit der main-Methode drin), in welcher ein Objekt des Hauptframes erzeugt wurde (einfach nur mit new HauptFrame() ). Ihr meint also, es wäre besser, wenn ich dort in dieser Klasse das JFrame-Objekt erzeugen, konfigurieren und mit den Komponenten füllen würde? So richtig überzeugt bin ich immer noch nicht. Ich sehe immer noch keine richtigen Nachteile, und Vorteile, ausser jetzt wegen der Übersichtlichkeit.
 
B

bygones

Gast
wir hatten hier schonmal die Diskussion und da kam raus, dass das Hauptproblem bei Swing leider ist, dass keine korrekte Schnitstellen zur Verfuegung stehen.

Ich sag auch nicht, dass man jegliche componente immer per Komposition nehmen soll.

Vererbung ist jedoch wie der Hammer in der Hand, und alles sieht dann aus wie ein Nagel.

das Problem mit der Vererbung vor allem ist eben das veroeffentlichen aller Methoden der Oberklasse. hat man einen Panel der ganz toll was bestimmtes macht, ein bestimmtes layout verwendet, somit die komponents toll anordnet etc. Nutzt man nun Vererbung geht die eigentliche addComp Methode unter all den anderen adds unter und jeder Verwender kann ganz leicht die Anordung bzw den gedachten Sinn der Component aushebeln bzw falsch gebrauchen. Bei der Komposition hat man nicht das Problem, da man dort nur die methoden so anbieten, wie ein Verwender sie nutzen soll.

Das jedoch ist in der Swing welt aufgrund der fehlenden Schnittstellen nicht so einfach zu realisieren.

Ich persoenlich wuerde es immer so machen dass ich mit Komposition anfange und nur wenn es definitiv nicht weiter geht Vererbung als Moeglichkeit in Betracht ziehen
 
D

DerAlk

Gast
Abschließend hierzu noch einmal vielen Dank.
Meine Frage wurde dahingehend beantwortet, bzw. sehe ich sie als beantwortet an, dass das Erben von JFrame eigentlich nicht richtig ist, so lange man nicht die Funktionalität des Fensters verändern muss.
Trotzdem sieht man es immer wieder in Code-Beispielen und so wie einige berichtet haben, scheint es ja auch durchaus gelehrt worden zu sein/wird es noch.
 

DrZoidberg

Top Contributor
Also wenn es nur darum geht den Code etwas kürzer oder übersichtlicher zu gestalten kann man auch den anonymen Konstruktor verwenden.

Java:
JFrame frame = new JFrame("Hallo Welt") {{
    setSize(300,300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
}};
 
G

Gast2

Gast
Was du hier erstellst ist ne anonyme Klasse, kein anonymer Konstruktor.
Das ganze nennt sich dann double brace initialization.
 

DrZoidberg

Top Contributor
Was du hier erstellst ist ne anonyme Klasse, kein anonymer Konstruktor.
Das ganze nennt sich dann double brace initialization.

Bei der "double brace initialization" handelt es sich um eine anonyme Klasse mit einem anonymen Konstruktor.

Java:
class Klasse {

Klasse() {
//normaler Konstruktor
}

static {
//statischer Konstruktor
}

{
//anonymer Konstruktor
}
}
 

hdi

Top Contributor
Afaik lautet die richtige Terminologie:

Java:
class Klasse {
 
Klasse() {
//normaler Konstruktor
}
 
static {
//statischer Initialisierungsblock
}
 
{
//nicht-statischer Initialisierungsblock
}
}

Erstmal gibt's im statischen Kontext sowas wie einen Konstruktor gar nicht. Ein Konstruktor erzeugt ein Objekt. Und der nicht-statische Init-Block ist auch kein Konstruktor, denn ein Konstruktor wird nach wie vor aufgerufen. Der Init-Block wird im Zuge der Instanz-Initialisierung ausgeführt, vor dem Konstruktor. Mach doch mal ein Sysout in deinen "normalen Konstruktor" oben, und eines da rein was du als "anonymen" Konstruktor bezeichnest. Und dann erzeug mal eine Instanz.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Oberflächen: lieber von JFrame oder JPanel erben? Java Basics - Anfänger-Themen 3
I Java updatebar? Oder lieber C# nutzen? Java Basics - Anfänger-Themen 9
S getter, setter in abstrakter Klasse oder lieber Unterklassen Java Basics - Anfänger-Themen 4
M Variable noch erstellen oder lieber so? Java Basics - Anfänger-Themen 1
L Erste Schritte Java oder doch lieber PHP? Java Basics - Anfänger-Themen 2
L Erste Schritte Sollte ich hier lieber Cases verwenden oder wäre eine If-Bedingung besser? Java Basics - Anfänger-Themen 6
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
C Mein Programm rechnet lieber als dass es malt - warum? Java Basics - Anfänger-Themen 10
K java oder lieber C# Java Basics - Anfänger-Themen 19
fragenÜber(fragen); Turtle Grafik mit GUI (JFrame) Java Basics - Anfänger-Themen 3
E JFrame + Buffer-strategy Java Basics - Anfänger-Themen 8
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
B HSQL mit JFrame steuern Java Basics - Anfänger-Themen 4
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
D Erste Schritte png in JFrame anzeigen? Java Basics - Anfänger-Themen 3
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
S Kontrollieren ob jframe disposed ist Java Basics - Anfänger-Themen 3
Elyt JFrame in den Hintergrund verschieben Java Basics - Anfänger-Themen 3
OSchriever JFrame-Anwendungsfenster verschieben Java Basics - Anfänger-Themen 17
M Bild in JFrame Java Basics - Anfänger-Themen 1
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S JFrame mit Hintergrundbild und Button Java Basics - Anfänger-Themen 4
S JFrame Java Basics - Anfänger-Themen 15
I JFrame proportional verkleinerbar machen Java Basics - Anfänger-Themen 3
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
T Auslagern von Methoden bei einem JFrame Java Basics - Anfänger-Themen 6
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
J JFrame Fenster öffnet sich nicht Java Basics - Anfänger-Themen 7
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
R JFrame nicht verschiebbar Java Basics - Anfänger-Themen 2
T Wenn JFrame Textfelder Hintergrund Grün dann... (if) Java Basics - Anfänger-Themen 3
K Java JFrame mit Hintergrundbild erstellen Java Basics - Anfänger-Themen 1
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
H Eclipse JFrame Java Basics - Anfänger-Themen 3
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
I JFrame minimieren wenn anderes Programm minimiert wird Java Basics - Anfänger-Themen 1
K Methoden Methode starten wenn JFrame geöffnet wird Java Basics - Anfänger-Themen 2
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
B Ist MyFrame oder JFrame besser? Java Basics - Anfänger-Themen 3
Y JFrame sichtbarkeit Java Basics - Anfänger-Themen 4
KeVoZ_ Label auf JFrame willkürlich Positionieren Java Basics - Anfänger-Themen 2
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
P JFrame nur einmal öffnen Java Basics - Anfänger-Themen 4
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
V Tastatur initialisieren JFrame Probleme Java Basics - Anfänger-Themen 6
J JPG in JFrame anzeigen lassen Java Basics - Anfänger-Themen 3
J JFrame ausgabe von Werten Java Basics - Anfänger-Themen 9
F GUI als Klasse oder extend JFrame? Java Basics - Anfänger-Themen 6
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
L [JFrame] Exception - woher? Java Basics - Anfänger-Themen 8
thomasbomme Grafikfehler JFrame- Cleartype Java Basics - Anfänger-Themen 1
GreyFox Arbeit mit JFrame Java Basics - Anfänger-Themen 8
T Erste Schritte 2 Codes zusammen fügen / Label in JFrame Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
dat_vin JFrame öffnet sich mehrmals Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
M Rahmen für undekorierten JFrame Java Basics - Anfänger-Themen 6
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
B Erste Schritte JFrame in Klasse auslagern Java Basics - Anfänger-Themen 4
H JFrame komplett schließen Java Basics - Anfänger-Themen 3
S Brauche hilfe bei Pong (JFrame) Java Basics - Anfänger-Themen 2
M hintergrund in jframe festlegen Java Basics - Anfänger-Themen 4
J JFrame Render Fehler - Warum? Java Basics - Anfänger-Themen 2
I komponenten werden in JFrame nicht richtig angezeigt Java Basics - Anfänger-Themen 1
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
D Best Practice JFrame im JFrame Java Basics - Anfänger-Themen 2
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
S Erste Schritte Von JFrame in nächstes JFRame wechseln Java Basics - Anfänger-Themen 0
V JFrame aktualisieren Java Basics - Anfänger-Themen 6
S JFrame ist nicht schwarz Java Basics - Anfänger-Themen 5
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
S JFrame wird nicht "bemalt" Java Basics - Anfänger-Themen 2
M Unsichtbare Objekte in JFrame Java Basics - Anfänger-Themen 2
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
Sogomn JLabel in anderer Klasse zum JFrame hinzufügen Java Basics - Anfänger-Themen 2
B Drawline wird auf JFrame nicht angezeigt Java Basics - Anfänger-Themen 3
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
K Methoden Objekt auf JFrame zeichnen Java Basics - Anfänger-Themen 16
S JFrame leeren Java Basics - Anfänger-Themen 6
X JFrame Fenster einzeln schließen Java Basics - Anfänger-Themen 2
J Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 7
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
P JFrame Component automatische Größe verhindern Java Basics - Anfänger-Themen 2
D JFrame, Komponenten verschmiert. Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben