Verständnisproblem zu Swing und Methoden

  • Themenstarter Themenstarter Gelöschtes Mitglied 17508
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 17508

Gast
Hallo Forum!

Ich habe ein Verständnisproblem bzgl. Swing, Methoden, Konstruktoren und deren Schreibweise.

Ich weiss was Konstruktoren u. Methoden sind.
Aber die Sschreibweise in Swing verwirrt mich einfach!

(Folgende Bsp habe ich übernommen!)

Z. B: folgendes Bsp:

Code:
import javax.swing.*;
import java.awt.*;

public class HelloWorld extends JFrame {
        static JLabel lbText = new JLabel("Hallo Welt",0);

	        HelloWorld() {
	                super("Titel");
			getContentPane().add(lbText);
	                setSize(10,20);
	                pack();
	                setVisible(true);
	        }

	public static void main ( String[] argv) {
                new HelloWorld();
        }
}

Wieso ist es möglich im Konstruktor eine Methode (.add()) aufzurufen?
Warum kann ich hier in der main Klasse den grössten Teil weglassen?

Ich dachte mir lt. Bücher baut man eine Klasse so auf:

class (instanziieren mit xy z = new xy)
konstruktor od default konstruktor
methoden

Hier wird aber alles ineinander verschachtelt.

Genauso verwirrt mich diese Schreibweise:

Code:
import javax.swing.*;
 
class HelloWorldSwing {
    public static void main(String[] args) {
        // Verpacke den auszuführenden Quellcode in ein eigenes
        // Runnable-Objekt, um diesen nachher im Event Dispatching
        // Thread ausführen zu können
        Runnable guiCreator = new Runnable() {
            public void run() {
                // Erstellt das Swing-Fenster
                JFrame fenster = new JFrame("Hallo Welt mit Swing");
                // Swing anweisen, das Programm zu beenden, wenn das Fenster
                // geschlossen wird
                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
                // Fügt den "Hallo Welt"-Text hinzu
                JLabel label = new JLabel("Hallo Welt");
                fenster.getContentPane().add(label);
 
                // Zeigt das Fenster an
                fenster.setSize(300, 200);
                fenster.setVisible(true);
            }
        };
 
        // Führe den obigen Quellcode im Event-Dispatch-Thread aus
        SwingUtilities.invokeLater(guiCreator);
    }
}

Hier wird in einer Methode einer Klasse new aufgerufen.
Ich war es von Konsolenprogrammen gewöhnt, dass in der main Methode mit new alles instanziiert wird.

Diese ganze Schreibweise kommt mir komplett spanisch vor.
Kann man mir sie vll. jemand näher erläutern bzw. wo ich eine wirklich gute Doku finde, wo genau diese Fragen näher beleuchtet werden.

Danke Euch schon mal vielmals!

lG
 
Das hat nichts direkt mit Swing zu tun. Bei deinem ersten Code, kannst du diese Methoden aufrufen, da du diese erbst [c]extends JFrame[/c].
(Vererbung)

Bei deinem zweiten Code handelt es sich um eine anonyme innere Klasse (klick)
 
Danke Dir vielmals mal für die Antworten.
Leider habe ich aber noch ein paar dumme Fragen!

Ok, dass ich die Methoden erbe verstehe ich!
Ist mir einleuchtend, aber seit wann ruft man Methoden im Konstruktor auf?
Im Konstruktor werden ja "nur" die ganzen Sachen nur zugewiesen und initialisiert?!
 
Ist mir einleuchtend, aber seit wann ruft man Methoden im Konstruktor auf?
Im Konstruktor werden ja "nur" die ganzen Sachen nur zugewiesen und initialisiert?!

Schon immer *g*
Ne, also klar kannst du Methoden im Konstruktor aufrufen.
Was du wahrscheinlich jetzt meinst ist, dass du nur so etwas kennst:
Java:
class Person {
	private String name;

	public Person(String name) {
		this.name = name; //zuweisung
	}

	public void setName(String name) {
		this.name = name;
	}
}

....

aber man kann da ja genau so gut auch den Setter aufrufen:
Java:
	public Person(String name) {
		this.setName(name); 
	}

Grob gesagt, du kannst eig. im Konstruktor alles machen, was du woanders(Block) auch machen kannst ;D (rein theoretisch, ob das immer so schön ist, ist ne` andere Frage)
 
Zuletzt bearbeitet:
Naja, Konstruktor ist ja auch nur eine Methode vom Typ der Klasse. Und wenn du dort eine Methode aufrufst, dann ist halt rekursiver Aufruf.
 
Richtig, ich kenne die Sachen nur so, wie du sie geschrieben hast!
Deswegen verstehe ich diese Schreibweise überhaupt nicht.

Kann man dann auch Berechnungen im Konstruktor durchführen, da ja Methoden, so wie ich sie kenne, nicht nötig sein dürften?
Könnte ich im Konstruktor dann mittels println..) etwas ausgeben?

Ok, danke dir vielmals!
Wenn das so ist, wie es ist, dann akzeptiere ich das 🙂
 
Kann man dann auch Berechnungen im Konstruktor durchführen, da ja Methoden, so wie ich sie kenne, nicht nötig sein dürften?
Könnte ich im Konstruktor dann mittels println..) etwas ausgeben?
Du kannst Dir den Konstruktor erst einmal wie eine normale Methode ohne Rückgabewert vorstellen. Der Unterschied ist der, daß ein Konstruktor immer beim Erstellen eines Objektes ausgeführt wird, während eine normale Methode irgendwo aufgerufen werden muß.

Schreibst Du nun in den Konstrutkor ein System.out.println rein, dann wird jedesmal etwas ausgegeben, wenn Du ein neues Objekt von der Klasse erzeugst. So etwas kann sehr nützlich sein, um beispielsweise einen Fehler zu finden und zu schauen, ob überhaupt ein Objekt erstellt wird.

Natürlich kannst Du im Konstruktor auch etwas berechnen oder Dateien schreiben, aber bedenke dabei immer, daß das passiert, wenn ein Objekt erstellt wird! Meist will man nicht, daß beim Erzeugen eines Objektes viel passiert. Es ist zudem klarer, daß etwas berechnet wird, wenn man die Methode calculate() aufruft, als wenn man einfach nur ein Objekt erstellt. Konstruktoren haben außerdem keine Rückgabewerte.

Es kann auch nützlich sein, im Konstruktor etwas zu prüfen. Ist die übergebene Datei überhaupt vorhanden? Ist der übergebene Wert positiv? Konstruktoren können daher allerlei Ausnahmen werfen wie FileNotFoundException oder IllegalArgumentException.
 
Danke Euch für die Erklärungen, soweit ist mir vieles diesbezüglich klarer geworden!
Ein paar letzte Fragen hätte ich noch:

1) Welchen Vor oder Nachteil hat es, wenn ich ein getContentPane().add(lbText); bereits im Konstruktor ausführe?
2) Macht man das nur, weil man schreibfaul ist u. nicht erst das Ganze nach dem Schema

class
konstruktor
methode

aufbauen will?
3) Oder hat es doch einen gewichtigeren Grund?

4) Wäre es überhaupt möglich, das Ganze nach meinem obigen Prinzip zu gestalten?

Danke Euch vielmals!
 

Zurück
Oben