Kommunikation zwischen Klassen / Konstruktoren bei Swing

Diskutiere Kommunikation zwischen Klassen / Konstruktoren bei Swing im AWT, Swing, JavaFX & SWT Bereich.
L

Lucoding

Hallo,
Mein Code, um eine GUI-Oberfläche zu erzeugen, befinden sich noch in einer Klasse. Ich habe derzeit knapp 7 Labels sowie etwa 7 Buttons. Mir ist bewusst, dass dieser Code unfassbar schlecht ist, da alles in eine Klasse gepackt ist. Nun möchte ich die Labels, Buttons und die Eigenschaften des Fensters in eigene Klassen aufteilen. Dies habe ich gemacht. Nun möchte ich durch eine extra Klasse (Main) das Fenster erzeugen mit allen Labels und Buttons zusammen. Nun erzeuge ich aber nur das Fenster, ohne Buttons und Labels. Dies liegt selbstverständlich daran, dass die Klasse "Fenster" keinen Zusammenhang mit den Klassen "Buttons" und "Labels" hat.
Benötige ich Beziehungsverhalten wie "Vererbung" oder "Interfaces". um das Problem lösen zu können?

Vielen Dank im Voraus :)
 
MoxxiManagarm

MoxxiManagarm

Wir bräuchten ein bissl Code um die Frage genauer beantworten zu können :)
 
mrBrown

mrBrown

Code bitte als Text, nicht als Screenshot :)

Was man aber schon mal als erstes sagen kann: du brauchst keinerlei Vererbung in deinem Programm, die wo du sie nutzt ist sie in jedem Fall falsch
 
L

Lucoding

Das hier ist die Main-Methode, welche das Fenster mit den Buttons und den Labels erzeugen soll

Java:
public class Main {


    public static void main(String[] args) {

       //Hier sollte das Fenster aufgerufen werden

    }

}

Java:
import javax.swing.*;
import javax.swing.JPanel;
import java.awt.*;
import static javax.swing.JComponent.setDefaultLocale;

public class Fenster {

    JFrame frame;
    static JPanel panel;

    public Fenster() {
        frame = new JFrame();
        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
        panel.setLayout(null);
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Hauptseite - GUI");
        frame.pack();
        frame.setVisible(true);
        frame.setSize(1500, 700);
        frame.setLocationRelativeTo(null);
        setDefaultLocale(null);
    }
}

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

public class Button extends Fenster {

    JButton buttonEinchecken,
            buttonAuschecken,
            buttonFarbig;
  
    public Button() {
      
        buttonEinchecken = new JButton("einchecken");
        buttonEinchecken.setSize(100, 100);
        buttonEinchecken.setBounds(800, 50, 200, 50);
        buttonEinchecken.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonEinchecken);
        buttonEinchecken.addActionListener((ActionListener) this);
        buttonEinchecken.setActionCommand("einchecken");
      
        buttonAuschecken = new JButton("auschecken");
        buttonAuschecken.setSize(100, 100);
        buttonAuschecken.setBounds(1020, 50, 200, 50);
        buttonAuschecken.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonAuschecken);
        buttonAuschecken.addActionListener((ActionListener) this);
        buttonAuschecken.setActionCommand("auschecken");
      
        buttonFarbig = new JButton("");
        buttonFarbig.setSize(100, 100);
        buttonFarbig.setBounds(920, 150, 200, 50);
        panel.add(buttonFarbig);
      
    }
  
}

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

public class Label extends Fenster {

    JLabel label5, label6;

    public Label() {

        label5 = new JLabel();
        label5 = new JLabel("Vorname");
        label5.setBounds(350, 70, 500, 150);
        label5.setFont(new Font("Arial", Font.BOLD, 18));
        panel.add(label5);

        label6 = new JLabel();
        label6 = new JLabel("Nachname");
        label6.setBounds(350, 120, 500, 150);
        label6.setFont(new Font("Arial", Font.BOLD, 18));
        panel.add(label6);
    }
}
 
Zuletzt bearbeitet von einem Moderator:
L

Lucoding

Code bitte als Text, nicht als Screenshot :)

Was man aber schon mal als erstes sagen kann: du brauchst keinerlei Vererbung in deinem Programm, die wo du sie nutzt ist sie in jedem Fall falsch
Ich bin noch Anfänger, dass mein Code schlecht ist, ist mir durchaus bewusst :D
 
L

LimDul

Er ist nicht schlecht, er ist schlicht falsch.

Die Vererbung ist falsch. Warum erbt Label von Fenster? Vererbung ist immer eine "Is a" Beziehung. Das heißt, bei dir ist ein Label ein Fenster. Das ist aber definitiv nicht der Fall.

Es spricht auch nichts dagegen, dass Fenster in einer Klasse zusammenzubauen. Das kann man z.B. in mehrere Methoden auslagern (erzeugeLabels, erzeugeButtons)
 
L

Lucoding

Er ist nicht schlecht, er ist schlicht falsch.

Die Vererbung ist falsch. Warum erbt Label von Fenster? Vererbung ist immer eine "Is a" Beziehung. Das heißt, bei dir ist ein Label ein Fenster. Das ist aber definitiv nicht der Fall.

Es spricht auch nichts dagegen, dass Fenster in einer Klasse zusammenzubauen. Das kann man z.B. in mehrere Methoden auslagern (erzeugeLabels, erzeugeButtons)
Danke für die Antwort, werde das mit der Vererbung anpassen.
 
L

Lucoding

Womöglich ist es besser, euch den erste Code (welcher in einer Klasse ist) zu zeigen.
Teilt man diesen Code nicht irgendwie auf, sodass er strukturierter ist und sich nicht alles in einer Klasse befindet? Beispielsweise habe ich etwas über das Model-View-Controller gelesen. Ist das das Verfahren, was man für eine bessere Übersicht des Programms nimmt?

Vielen Dank im Voraus :)


Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

import static javax.swing.JComponent.*;

public class Main implements ActionListener {

    JFrame frame;
    JPanel panel;
    JLabel label, label1, label2, label3, label4, label5, label6, label7;
    JButton buttonKundenSortieren,
            buttonNeuerKunde,
            buttonBestaetigen,
            buttonEinchecken,
            buttonAuschecken,
            buttonFarbig;
    JTextField textfeld1, textfeld2;
    JProgressBar progressBarBestaetigen;
    int i;
    Timer t = new Timer(1000, this);
    Thread thread = new Thread();
    ImageIcon wlan;


    public Main() {

        //FENSTER____________________________________________________________________________________________
        frame = new JFrame();
        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
        panel.setLayout(null);
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Managementsystem - GUI");
        frame.pack();
        frame.setVisible(true);
        frame.setSize(1500, 700);
        frame.setLocationRelativeTo(null);
        setDefaultLocale(null);

        //ZEITAUSGABE_______________________________________________________________________________________
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String formattedDate = sdf.format(date);
        label4 = new JLabel();
        label4 = new JLabel(formattedDate);
        panel.add(label4);

        //BUTTON_____________________________________________________________________________________________
        buttonKundenSortieren = new JButton("Kunden sortieren");
        buttonKundenSortieren.setBounds(50, 50, 250, 50);
        buttonKundenSortieren.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonKundenSortieren);
        
        buttonNeuerKunde = new JButton("neuen Kunden anlegen");
        buttonNeuerKunde.setSize(100, 100);
        buttonNeuerKunde.setBounds(350, 50, 320, 50);
        buttonNeuerKunde.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonNeuerKunde);
        
        buttonBestaetigen = new JButton("bestätigen");
        buttonBestaetigen.setSize(100, 100);
        buttonBestaetigen.setBounds(470, 230, 200, 40);
        buttonBestaetigen.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonBestaetigen);
        
        buttonBestaetigen.addActionListener(this);
        buttonBestaetigen.setActionCommand("bestätigen");
        
        buttonEinchecken = new JButton("einchecken");
        buttonEinchecken.setSize(100, 100);
        buttonEinchecken.setBounds(800, 50, 200, 50);
        buttonEinchecken.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonEinchecken);
        buttonEinchecken.addActionListener(this);
        buttonEinchecken.setActionCommand("einchecken");
        
        buttonAuschecken = new JButton("auschecken");
        buttonAuschecken.setSize(100, 100);
        buttonAuschecken.setBounds(1020, 50, 200, 50);
        buttonAuschecken.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(buttonAuschecken);
        buttonAuschecken.addActionListener(this);
        buttonAuschecken.setActionCommand("auschecken");
        
        buttonFarbig = new JButton("");
        buttonFarbig.setSize(100, 100);
        buttonFarbig.setBounds(920, 150, 200, 50);
        panel.add(buttonFarbig);

        //KUNDEN____________________________________________________________________________________________
        Kunden[] kunden = new Kunden[3];
        kunden[0] = new Kunden("Günter", "Friedrich", 45, 40, 2);
        kunden[1] = new Kunden("Jörg", "Seibert", 60, 17, 3);
        kunden[2] = new Kunden("Hans", "Ulrich", 70, 24, 0);

        //LABEL____________________________________________________________________________________
        label3 = new JLabel();
        label3 = new JLabel("Kunden aktuell: ");
        label3.setBounds(50, 70, 200, 150);
        label3.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(label3);
        
        label = new JLabel();
        label = new JLabel(kunden[0].toString());
        label.setBounds(50, 100, 500, 150);
        label.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(label);
        
        label1 = new JLabel();
        label1 = new JLabel(kunden[1].toString());
        label1.setBounds(50, 130, 500, 150);
        label1.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(label1);
        
        label2 = new JLabel();
        label2 = new JLabel(kunden[2].toString());
        label2.setBounds(50, 160, 500, 150);
        label2.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(label2);
        
        label7 = new JLabel();
        label7 = new JLabel("Kunden neu: ");
        label7.setBounds(50, 200, 200, 150);
        label7.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(label7);

        //LABEL NEUEN KUNDEN ANLEGEN________________________________________________________________________
        label5 = new JLabel();
        label5 = new JLabel("Vorname");
        label5.setBounds(350, 70, 500, 150);
        label5.setFont(new Font("Arial", Font.BOLD, 18));
        panel.add(label5);
      
        label6 = new JLabel();
        label6 = new JLabel("Nachname");
        label6.setBounds(350, 120, 500, 150);
        label6.setFont(new Font("Arial", Font.BOLD, 18));
        panel.add(label6);
        
        //TEXTFELD NEUEN KUNDEN ANLEGEN____________________________________________________________________
        textfeld1 = new JTextField();
        textfeld1.setBounds(470, 130, 200, 30);
        textfeld1.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(textfeld1);
        
        textfeld2 = new JTextField();
        textfeld2.setBounds(470, 180, 200, 30);
        textfeld2.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(textfeld2);

        //JPROGRESSBAR____________________________________________________________________________________
        progressBarBestaetigen = new JProgressBar(0, 100);
        progressBarBestaetigen.setSize(100, 100);
        progressBarBestaetigen.setBounds(470, 350, 200, 40);
        progressBarBestaetigen.setStringPainted(true);
        //progressBarBestaetigen.setString("Kunde wird angelegt...");
        progressBarBestaetigen.setFont(new Font("Arial", Font.BOLD, 15));
        panel.add(progressBarBestaetigen);

        //FOTO_____________________________________________________________________________________________
        wlan = new ImageIcon(getClass().getResource("wlan64x64.png"));
        JLabel lab = new JLabel(wlan);
        lab.setBounds(1350, 2, 150, 150);
        panel.add(lab);

    }
    
    @Override
    public void actionPerformed(ActionEvent e) {

        //Buttons ein- und auschecken
        if ("einchecken".equals(e.getActionCommand())) {
            buttonFarbig.setBackground(Color.GREEN);
        }
        if ("auschecken".equals(e.getActionCommand())) {
            buttonFarbig.setBackground(Color.RED);
        }
        


        //ProgressBar - mit Button bestätigen
        new Thread() {
            public void run() {

                if ("bestätigen".equals(e.getActionCommand())) {
                    while (i <= 100) {
                        try {
                            progressBarBestaetigen.setValue(i);
                            i++;
                            thread.sleep(25);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }

                        if (i == 100) {
                            System.out.println("Kunde wurde angelegt");
                        }
                    }
                }
            }

        }.start();
    }
    
    public static void main(String[] args) {
        new Main();
    }

}
 
B

Bela B.

Kenne mich zwar mit Swing nicht (mehr) aus, aber prinzipiell löst man das mittels MVC oder einem anderen Pattern wie z.B. MVVM.
Für einen ersten, kleinen Einblick in MVC mit Swing findest du z.B. hier etwas, wobei das Internet da voll von Tutorials sein sollte.

Ziel sollte zumindest sein, die Abhängigkeiten der einzelnen Bestandteile (also Model, View, Controller) soweit es geht getrennt zu halten. Der große Nutzen ist neben mehr Übersichtlichkeit und klarere Zuständigkeiten auch, dass man die View dann ziemlich einfach austauschen kann.
 
Thema: 

Kommunikation zwischen Klassen / Konstruktoren bei Swing

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben