Was macht e.getSource() ?

melaniemueller

Aktives Mitglied
Guten Abend 😊
Mein neues Thema: Die ersten grafischen Oberflächen mit AWT und Swing erstellen.
Bisher habe ich ein Fenster erstellt, mit einem Button und auch Listener kamen nun dazu. Jetzt gibts in meinem Studienheft ein Beispiel welches ich nicht so ganz nachvollziehen kann und ich es einfach gerne verstehen möchte.
Hauptsächlich scheitert mein Verständnis an e.getSource() . Was genau macht diese Methode?
Ich erkläre mal eben das Beispiel:

Es soll ein Fenster erscheinen bei dem man eingibt wer die Welt grüßen möchte. Dies gibt man ein und anschließend wird der Text den man eingegeben hat verwendet für das 2. Fenster, dass sich anschließend öffnet mit dem Text "Hallo Welt es grüßt dich ...." mit einem "Beenden" Button. Das Anlegen der Fenster etc. habe ich alles verstanden, nur wie genau der eingegebene Text nun in das Fenster gelangt, kann ich nicht nachvollziehen. Ich hab den fertigen Code, ich bräuchte nur jemanden der mir die Schritte nochmal ein wenig verständlicher als in meinem Heft erklären könnte.

Es gibt insgesamt 4 Klassen, aber für mein Problem sind nur 2 relevant daher teile ich nur die 2.

Java:
package de.fernschulen.j09d_03;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

//das Swing-Fenster
//die Klasse erbt von der Swing-Klasse JFrame
//JFrame bildet ein Anwendungsfenster ab
public class HalloWeltGUI extends JFrame{

    //die ID wurde automatisch über Eclipse eingefügt
    private static final long serialVersionUID = 8235308007913310676L;
    
    //die Komponenten sind jetzt private Instanzvariablen
    private JLabel ausgabe, ausgabe2;
    private JButton schaltflaeche;

    //der Konstruktor
    //er ruft den Konstruktor der Basisklasse auf
    //übergibt den Titel des Fensters
    //erzeugt die Komponenten und setzt weitere Eigenschaften des Fensters
    public HalloWeltGUI(String fenstertitel) {
        super(fenstertitel);
        //ein neues Label erzeugen
        ausgabe = new JLabel("Hallo Welt");
        //ein weiteres Label erzeugen
        ausgabe2 = new JLabel();
        //eine Schaltfläche erzeugen
        schaltflaeche = new JButton("Beenden");
        //ein Layout anwenden
        setLayout(new FlowLayout());
        //die Komponenten hinzufügen
        add(ausgabe);
        add(ausgabe2);
        add(schaltflaeche);
        //die Verbindung zwischen der Schaltfläche und dem Listener herstellen
        //übergeben wird eine neue Instanz unserer eigenen Listener-Klasse
        schaltflaeche.addActionListener(new SchaltflaecheListener());
        //die Verbindung zwischen dem Fenster und dem Listener herstellen
        //übergeben wird eine neue Instanz unserer Listener-Klasse für die Fenster-Ereignisse
        this.addWindowListener(new FensterListener());
        //das Fenster packen
        pack();
        //das Verhalten beim Schließen setzen
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //das Fenster sichtbar machen
        setVisible(true);
    }
    
    //die Methode setzt den Text im zweiten Label
    public void setAusgabe2Text(String text) {
        ausgabe2.setText("Es grüßt Dich " + text);
        //das Fenster neu packen
        pack();
    }
}

Die Klasse für den Fenster Listener:

Java:
package de.fernschulen.j09d_03;

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JOptionPane;

public class FensterListener implements WindowListener{

    //die "leeren" Methoden dürfen nicht gelöscht werden!!
    @Override
    public void windowActivated(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowClosed(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowClosing(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowIconified(WindowEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void windowOpened(WindowEvent e) {
        //für den Zugriff auf die Instanz der Klasse mit der grafischen Oberfläche
        HalloWeltGUI temp;
        //für die Eingabe
        String eingabe;
        //die Eingabe einlesen
        eingabe = JOptionPane.showInputDialog("Wer will die Welt grüßen?");
        //temp erhält die Referenz des Aufrufers
        //das Ergebnis von e.getSource() muss in den passenden Typen umgewandelt werden
        temp = (HalloWeltGUI)e.getSource();
        //die Methode setAusgabe2Text über temp aufrufen
        temp.setAusgabe2Text(eingabe);
    }
}
 
Bei dem WindowEvent gibt das getSource() zurück, welches Element für das Event verantwortlich ist.

Bei dem windowOpened wäre es also das Fenster, das geöffnet worden ist.

Und das ist dann die Instanz von HelloWeltGui, das du geöffnet hast (in deinem konkreten Fall).
 
und mit
temp.setAusgabe2Text(eingabe);
wird die setAusgabe2Text Methode der HelloWeltGui Klasse aufgerufen.
temp zeigt ja auf die Instanz dieser Klasse.

Ihr wird auch der eingegene Sting übergeben der dann in der ausgabe2 gesetzt und angezeigt wird.

PS mit pack(); wird nicht nur die grösse des Fensters angepast sondern bei bedarf auch neu gezeichnet.
du hast ja gerade den zweiten text gesetz und jetzt wird er beim neu zeichen angezeigt.
 
Zuletzt bearbeitet:

Zurück
Oben