Swing Wie sollte man seine JComponents vererben?

PaddyFH

Mitglied
Ich wollte ein Program schreiben, in dem eine Klasse ein Interface erstellt mit z.B. zwei JButtons. Dafür müsst ich ja die Buttons in die Subclasses vererben. Dies hatte ich schon folgendermaßen versucht, aber ich finde es ist nicht wahnsinnig elegan und funktionieren tut es irgendwie auch nicht😡:
Java:
import javax.swing.*;

public class MainMenu {
  
   protected static JFrame frame = new JFrame();
   protected static JPanel mainPanel = new JPanel();
   protected static JButton button1 = new JButton();
   protected static JButton button2 = new JButton();

   public static void main(String[] args) {
        mainPanel.add(button1);
        mainPanel.add(button2);
      
        frame.add(mainPanel);
        frame.pack();
        frame.setVisible(true);
   }

}
Und die subclass:
Java:
public class Button1 extends MainMenu {

   public Button1() {
       button1.addActionListener(e -> {
           System.out.println("button1 is working");
       });
   }

}
 
Zuletzt bearbeitet:
Moin,
ich finde es ist nicht wahnsinnig elegant und funktionieren tut es irgendwie auch nicht
Es ist auch grundlegend falsch, was Du da versuchst!!

(a) Du kannst nicht von der Hauptklasse erben! Vererben solltest Du nur, wenn Du die Oberklasse erweitern willst, was aber hier nun gar keinen Sinn macht!
(b) eine Klasse 'Button' existiert schon!! (https://docs.oracle.com/javase/7/docs/api/java/awt/Button.html)
(c) was soll 'tButton' sein?? Ein Konstruktor müsste immer so wie die Klasse heißen!
(d) aus welchem Grund sollten die ActionListener nicht in der Hauptklasse liegen?
(e) Dein 'mailPanel' weißt doch nichts von der Unterklasse (woher auch). Die deklarierten Button sind vom Typ 'JButton' !!

EDIT: vielleicht noch dies: https://docs.oracle.com/javase/tutorial/uiswing/components/button.html

VG Klaus
 
Okay, danke für die Antwort! Zu
  • (a) + (d) Mit einem Beispiel wie ich es hab ist es natürlich recht unpraktisch für jedeJButton eine neue Klasse zu erstellen. ABer im eigentlichem Programm will ich deutlich mehr in die Lambda Function packen.
  • (b) + (c) hab ich gefixt war nur ein Tipfehler
  • (e) Hier verstehe ich es nicht: warum muss die Klasse Button1 vom Panel "mainPanel" wissen wenn sie nur den actionListener handeln sollte.
Erstmal vielen Dank für die Hilfe!
 
Um gleich mal die Hauptfrage zu beantworten:

Wie sollte man seine JComponents vererben?

Du (noch) gar nicht.

1. static lässt sich in dem Sinn nicht vererben:
Java:
// Test.java:

class A {
    static int x = 10;
}

public class Test extends A {
    public static void main(String[] args) {
        Test.x = 5;
        System.out.println(Test.x);
        System.out.println(A.x);
    }
}

2. es ist eher selten notwendig, irgendwelche von JComponent abgeleiteten Klassen zu erweitern. Schon gar nicht, um irgend etwas zusammen zu bauen: man erweitert ja auch keinen String, weil man eine Zeichenkette mit zwei Buchstaben haben will.

3. Wie kommst Du darauf, irgendetwas vererben zu müssen?
 

Neue Themen


Zurück
Oben