Frage zur objektorentierten Swing Programmierung

Java_Fan_

Mitglied
Guten Abend,

und zwar stelle ich mir folgende Frage. Bei diesem objektorientierten Ansatz zur Erstellung eines JFrames wurde folgender Code verwendet:

Java:
/* Listing3601.java */

import javax.swing.*;
import java.awt.event.*;

public class Listing3601 extends JFrame {
   public Listing3601() {
      super("Ein einfacher JFrame");
      addWindowListener(new WindowClosingAdapter(true));
   }

   public static void main(String[] args) {
      Listing3601 wnd = new Listing3601();
      wnd.setLocation(100, 100);
      wnd.setSize(300, 200);
      wnd.setVisible(true);
   }
}

Nun Frage ich mich die Klasse Listing3601 erbt ja alle Eigenschaften der importierten Klasse JFrame, d.h alle Funktionen die public sind sowie Methoden(gorb gesagt). So nun zum Konstruktor von der Klasse Listing3601. Diese verwendet ja die Funktion super(). Diese ruft ja den Konstruktor von JFrame auf. Nur Frage ich mich jetzt im Hauptprogramm wie es möglich ist, dass ein Fenster erzeugt wird, wenn es doch gar kein JFrame-Objekt im Sinne von JFrame fenster = new JFrame(); geschaffen wurde? Ich weiß das es mit dem Konstruktoraufruf durch super zusammenhängt, kann mir jemand aber mal erklären wie genau?

Mit freundlichen Grüßen
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Die Listing Klasse erbt von JFrame und ist damit auch ein JFrame. Der new Operator auf die Listing Klasse erzeugt somit ein JFrame.

Evtl. Wird es deutlich, wenn du die eine Zeile umändert in JFrame wnd = new Listing3601();

Konrad
 

Java_Fan_

Mitglied
Vielen Dank, jetzt ist mir das klar geworden.

Ich hätte aber noch eine Frage und diese bezieht sich diesmal auf die Implementierung des ActionListener.
Wenn ich ein Interface implementiere, welches ja nur abstrakte Methoden erhält, dann implementiere ich ja diese abtrakten Methoden. Also als Beispiel:

Java:
interface Punktschnittstelle
{
    /* Methoden, die von einem Punkt implementiert werden sollen */
    public int getX();
    public void setX(int i);
}

/* Unsere Klasse Punkt, die das Interface PunktSchnittstelle einbindet */
public class GraphObj
{
    private int x;
     /* Implementierung der Methode getX aus dem Interface PunktSchnittstelle */
    public int getX()
    {
        return x;
    }
    /* Implementierung der Methode setX aus dem Interface PunktSchnittstelle */
    public void setX(int i)
    {
        x = i;
    }

Mit der Implementierung "verpflichtet" man sich ja sozuagen, dass eine Klasse, die ein Interface implementiert, dass diese die Methoden des Interfaces beinhaltet. In diesem Beispiel kann man also auch das implementeren des Interfaces Punktschnittstelle weglassen und es würde funktionieren.

Im jetzigen Beispiel

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

// Damit Objekte der Klasse BeispielListener
// zum ActionListener werden kann, muss das Interface
// ActionListener implementiert werden
public class BeispielListener extends JFrame implements ActionListener
{
    JButton button1;
    JButton button2;
    JButton button3;
    JLabel label;
    JPanel panel;

    public BeispielListener(){
        this.setTitle("ActionListener Beispiel");
        this.setSize(400, 200);
        panel = new JPanel();

        // Leeres JLabel-Objekt wird erzeugt
        label = new JLabel();

        //Drei Buttons werden erstellt
        button1 = new JButton("Button 1");
        button2 = new JButton ("Button 2");
        button3 = new JButton ("Button 3");

        //Buttons werden dem Listener zugeordnet
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);

        //Buttons werden dem JPanel hinzugefügt
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);

        //JLabel wird dem Panel hinzugefügt
        panel.add(label);
        this.add(panel);
    }

    public static void main(String[] args)
    {
        // Ein neues Objekt der Klasse BeispielListener wird erzeugt
        // und sichtbar gemacht
        BeispielListener bl = new BeispielListener();
        bl.setVisible(true);
    }

    public void actionPerformed (ActionEvent ae){
        // Die Quelle wird mit getSource() abgefragt und mit den
        // Buttons abgeglichen. Wenn die Quelle des ActionEvents einer
        // der Buttons ist, wird der Text des JLabels entsprechend geändert
        if(ae.getSource() == this.button1){
            label.setText(("Button 1 wurde betätigt"));
        }
        else if(ae.getSource() == this.button2){
            label.setText("Button 2 wurde betätigt");
        }
        else if (ae.getSource() == this.button3){
            label.setText(("Button 3 wurde betätigt"));
        }
    }
}

verstehe ich nicht so ganz, warum ich den ActionListener implementieren muss, wenn dieser doch wie eh nur abstrakte Methoden enthält. Warum darf ich die Implementierung des ActionListener nicht einfach weglassen?
 

Joose

Top Contributor
Klassen welche ein Interface implementieren verpflichten sich bestimmte Methoden zu implementieren (ob diese sinnvoll oder nicht sinnvoll implementiert sind ist etwas anderes ;)).

Deine Klasse "BeispielListener" implementiert das Interface "ActionListener" und muss daher dessen Methode implementieren.
Deine Klasse "GraphObj" implementiert keine Interfaces daher könnte man die Methode getX und setX auch weglassen.
 
K

kneitzel

Gast
Das Wichtige ist, dass ich dann eine Instanz der Klasse unter dem Interface ansprechen kann.

Also bei Deinem Beispiel mit der Punktschnittstelle:

Wenn ich eine Funktion habe, die als Parameter eine Punktschnittstelle erwartet, dann kann ich ein GraphObj derzeit nicht übergeben. Sobald GraphObj aber Punktschnittstelle implementiert kann ich eine Instanz von GraphObj übergeben.

So auch in dem konkreten Beispiel: addActionListener will einen ActionListener als Parameter. Wenn Deine Class ActionListener nicht implementiert, dann kannst Du die auch nicht übergeben, aber genau das willst Du ja wenn Du this übergibst.

Konrad
 

Java_Fan_

Mitglied
"Das Wichtigste ist, dass ich dann eine Instanz der Klasse unter dem Interface ansprechen kann."
Könntest du das nochmal bitte erläutern? Ich dachte der ActionListener wäre nur ein Interface. Ich kann doch auch so mit this die Klasse BeispielListener ansprechen? Und das die Klasse BeispielListener die Methoden des ActionListener verwenden muss, ist ja verständlich, aber warum muss ich ihn implementieren. Ich könnte ja auch einfach so seine Funktion add verwenden, da diese ja im Interface nur abstrakt und nicht konkret formuliert ist?
 
K

kneitzel

Gast
Also wenn Klasse MyClass von SuperClass abgeleitet wird und MyInterface implementiert, dann sind folgende Zuweisungen möglich:
Code:
MyClass c = new MyClass();
SuperClass s = c;
MyInterface i = c;

Und Dein Code hatte u.a. folgende Zeilen:
Code:
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);

Hast Du Dir die Dokumentation der Funktion addActionListener schon einmal angesehen? Was wird da als Parameter erwartet?
Also https://docs.oracle.com/javase/7/docs/api/javax/swing/JButton.html ansehen - addActionListener ist von AbstractButton geerbt. Und somit landet man bei https://docs.oracle.com/javase/7/do...ActionListener(java.awt.event.ActionListener)

Argument ist ein ActionListener. Und aus dem ersten Beispiel hast Du hoffentlich gelernt, dass Instanzen einer Klasse nicht nur in ihre Super-Klassen sondern auch in die implementierten Interfaces gecastet werden kann.

Konrad
 

Java_Fan_

Mitglied
Also nur um noch einmal sicher zu gehen, dass ich das richtig verstanden habe. Der ActionListener ist ein Interface der Klasse AbstractButton, die ich geerbt habe(durch das JFrame?) und deshalb muss ich den ActionListener als Interface implementieren?
 
K

kneitzel

Gast
ActionListener ist einfach ein Interface. Das hat erst einmal mit keiner Klasse etwas zu tun. Nur eben gibt es dann Funktionen, die eine Instanz erwarten, die dieses Interface implementieren.

In diesem Fall ist das einfach eine Klasse, die auf eine Aktion hört. Dem Button wird sozusagen gesagt, in welcher Instanz die Funktion actionPerformed aufgerufen werden soll. Und in Deinem Code wolltest Du eben, dass dies Bestandteil Deiner Klasse BeispielListener sein soll. Das könnte aber auch irgend eine andere, beliebige Klasse sein. Ein Pattern, dass man öfters sieht ist die Erstellung einer neuen annonymen Klasse nur für diese Listener:
Code:
// ActionListener wird als anonyme Klasse eingebunden
        someItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                // Code der ausgeführt werden soll ...
            }
        });

Konrad
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben