Klassen Zugriff auf Objekt anderer Klasse

Chillma

Mitglied
Guten Abend,
ich weiß das es wahrscheinlich schon andere Threads zu diesem Thema gibt, jedoch habe ich noch nichts konkretes gefunden was mir hilft. Ich bin im ersten Semester und bin daher noch ein Anfänger.
Ich habe folgendes Problem. Ich habe die Klassen KFrame, KButton und Menue erstellt. In der Klasse Menue kann ich dann beliebig viele KFrames und auch KButtons erzeugen lassen. Mein Problem ist dass ich in der Klasse Menue die Buttons die ich erzeugt habe nicht in das Panel bekomme. Das Panel ist in der Klasse KFrame erzeugt worden. Ich brauche nun in der Klasse Menue zugriff auf das Objekt "panel" welches in der Klasse KFrame deklariert wurde, um die Buttons die ebenfalls in der Klasse Menue erzeugt wurden dem panel zuzuweisen. Ich weiß nicht mehr weiter ich habe schon viel gelesen und probiert jedoch ohne Erfolg. Warum wird mein Button dem Panel nicht zugewiesen? Alles ein wenig verwirrend aber hier nochmal mein Code:
Java:
import javax.swing.*;
import java.awt.*;
public class KFrame 
{
    // Variablen-deklaration der Klasse KFrame
    private int size1, size2;
    private String name;
    private boolean sichtbar, gleich;
    private Color color;
    JPanel panel = new JPanel();
    
    public KFrame(int x, int y, String pName, boolean pSichtbar, boolean pGleich,
    Color pColor)
    {
       //Kontruktor der Klasse KFrame
       size1 = x;
       size2 = y;
       name = pName;
       sichtbar = pSichtbar;
       gleich = pGleich;
       color = pColor;
    }
    
    public void createFrame()
    {
       //Hier wird ein Frame erzeugt 
       JFrame frame = new JFrame(name);
       frame.setVisible(sichtbar);
       frame.setSize(size1, size2);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setResizable(gleich);
       
       frame.add(panel);
       panel.setLayout(null);
       panel.setBackground(color);  
    }
}
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Menue extends JPanel
{
    //Deklaration von Variablen der jeweiligen Klassen
    private KFrame hauptfenster, nebenfenster1, nebenfenster2;
    private KButton spielstart, leaderboard, credits, exit;
    private KLabel titel, anleitung, lText, cText;

    public Menue()
    {
        //Erzeugung des Frame, Button und des Labels
        hauptfenster = new KFrame(1280,720,"Kick Snare Click Square",true,false,Color.gray);
        spielstart = new KButton(120,50,100,200,"Spielstart");
        titel = new KLabel(22,22,22,22,"jo",Color.black,"Segoe Script",Font.PLAIN,30);
    }
    
    public void main()
    {
       //Hier werden die Frames, Buttons und Labels erzeugt
       hauptfenster.createFrame();
       add(spielstart);// hier wird der Button Spielstart dem Panel NICHT zugewiesen ...
       spielstart.createButton();
       titel.createLabel();  
    }
}
 
so wirklich struktur ist in deinem code aber nicht zu finden ...

erst erzeugst du ein objekt von KFrame und initialisierst dieses komplett und stellst es dar ...
dann fügst du dem JPanel einen KButton hinzu und callst dann erst createButton() ? also alleine vom lesen macht das wenig sinn ...

ich denke das dein problem zur zeit erstmal weniger darin besteht mit referenzen richtig umzugehen und klassen entprechend zu designen als viel mehr darin überhaupt strukturiert zu schreiben ... von scheinbar fehlenden GUI-grundlagen abgesehen ...

da der code unvollständig ist und auch nicht wirklich klar wird was du genau machen willst ... und es scheint das dir einfach für das was du machen willst noch wissen fehlt würde ich dir vorschlagen erstmal grundsätzlich gute bücher zum thema strukturiertes programmieren und GUI-grundlagen zu lesen ...

findet sich alles in "Java ist auch eine Insel" ...

ansonsten kann man dir so schlecht helfen
 
Also ich ahbe einen funktionsfähigen Code geschrieben, jedoch ist dieser ziemlich lang und Code-Duplizierung ist vorhanden. Ich wollte eine Zusammengefasste, komprimierte Lösung finden. Da ich in diesem Code sehr viel, sehr oft erstelle habe ich mir gedacht, alles komprimiert zu schreiben, jedoch scheiter ich wie oben schon genannt.
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainMenue 
{ 
     public static void main (String[] args)
     {
        //Erstelle einen Rahmen(Anton Stepin)
        JFrame frame = new JFrame("Kick Snare Click Square");
        frame.setVisible(true);
        frame.setSize(1280,720);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocation(0, 0);

        //Füge die Inhaltsfläche hinzu(Anton Stepin)
        JPanel panel = new JPanel();
        frame.add(panel);
        panel.setLayout(null);
        panel.setBackground(Color.gray);
        
        //Füge dem Inhalt eine Überschrift hinzu(Anton Stepin)
        JLabel label = new JLabel("<html><body><center>Kick Snare Click Square</center></body></html>");
        panel.add(label);
        label.setBounds(250, 0, 1280, 120);
        Font titel = new Font("Segoe Script", Font.BOLD, 60);
        label.setFont(titel);
        label.setForeground(Color.cyan);
        
        //Füge dem Inhalt die Introduction-Überschrift hinzu(Anton Stepin)
        JLabel label2 = new JLabel("Anleitung");
        panel.add(label2);
        label2.setBounds(1000, 140, 1280, 100);
        Font anleitung = new Font("Segoe Script", Font.BOLD, 30);
        label2.setFont(anleitung);
        label2.setForeground(Color.cyan);
        
        //Füge Introduction einen Text hinzu(Anton Stepin)
        JLabel label3 =new JLabel("<html><body>Für dieses Spiel wird nur<br>" + 
                                  "die Maus benötigt. Beim Spiel-<br>" + 
                                  "start sehen Sie 9 Vierecke, <br>" +
                                  "die langsam ihre Farbe ändern.<br>" + 
                                  "Durch Mausklicks verhindern <br>" + 
                                  "Sie einen totalen Farbumsprung.<br>" + 
                                  "Versuchen Sie solange wie nur<br>" +
                                  "möglich die Vierecke daran zu<br>" + 
                                  "hindern ihre Farbe zuändern.<br>" + 
                                  "Ändert sich nur ein Viereck<br>" +
                                  "vollständig, ist das Spiel<br>" + 
                                  "beendet.</body></html>");
        panel.add(label3);
        label3.setBounds(1000, 130, 1280, 500);
        Font introductionText = new Font("Serif", Font.PLAIN, 20);
        label3.setFont(introductionText);
        
        //Füge dem Inhalt Buttons hinzu(Anton Stepin)
        JButton button1 = new JButton("Spielstart");
        JButton button2 = new JButton("Leaderboard");
        JButton button3 = new JButton("Credits");
        JButton button4 = new JButton("Schließen");
        button1.setSize(120, 50);
        button1.setLocation(100, 200);
        button2.setSize(120, 50);
        button2.setLocation(100, 300);
        button3.setSize(120, 50);
        button3.setLocation(100, 400);
        button4.setSize(120, 50);
        button4.setLocation(100, 500);
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);
        
        //Erstelle Aktionen für die Buttons(Anton Stepin)
        button1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                
            }
        }
        );
        button2.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                //Ein neues Fenster falls man man auf den Leaderboard Button drückt(Anton Stepin)
                JFrame frame3 = new JFrame("Leaderboard");
                frame3.setVisible(true);
                frame3.setSize(400,580);
                frame3.setResizable(false);
                JPanel panel3 =new JPanel();
                panel3.setLayout(null);
                panel3.setBackground(Color.gray);
                frame3.add(panel3);
                frame3.setLocation(450, 140);
             
                //Füge dem Inhalt die Leaderboard-Überschrift hinzu(Anton Stepin)
                JLabel label = new JLabel("Leaderboard");
                panel3.add(label);
                label.setBounds(95, 10, 600, 40);
                Font leaderBoard = new Font("Serif", Font.BOLD, 35);
                label.setFont(leaderBoard);
                label.setForeground(Color.cyan);
                
                JLabel label2 = new JLabel("<html><body>1.<br>"+"2.<br>"+"3.<br>"+
                "4.<br>"+"5.<br>"+"6.<br>"+"7.<br>"+"8.<br>"+"9.<br>"+"10.<br></body></html>");
                panel3.add(label2);
                label2.setBounds(0, 0, 400, 580);
                Font leaderBoard2 = new Font("Serif", Font.BOLD, 30);
                label2.setFont(leaderBoard);
            }
        }
        );
        button3.addActionListener(new ActionListener()
        {
             //Ein neues Fenster für den Fall dass man auf den Credits Button drückt(Anton Stepin)
             public void actionPerformed(ActionEvent e)
             { 
                JFrame frame2 = new JFrame("Credits");
                frame2.setVisible(true);
                frame2.setSize(400,580);
                frame2.setResizable(false);
                JPanel panel2 =new JPanel();
                panel2.setLayout(null);
                panel2.setBackground(Color.white);
                frame2.add(panel2);
                frame2.setLocation(450, 140);
             
                //Füge dem Inhalt die Credits-Überschrift hinzu(Anton Stepin)
                JLabel label = new JLabel("Credits");
                panel2.add(label);
                label.setBounds(5, 20, 600, 40);
                Font credits = new Font("Serif", Font.BOLD, 35);
                label.setFont(credits);
        
                //Füge Credits einen Text hinzu(Anton Stepin)
                JLabel label2 =new JLabel("<html><body>Kick Snare Click Square<br>"+
                                       "Version 1.0<br>"+
                                       "<br>"+
                                       "Zuständig für das Design:<br>"+
                                       "   XXX<br>"+
                                       "<br>"+
                                       "Zuständig für die Spielmechanik:<br>"+
                                       "   XXX<br>"+
                                       "<br>"+
                                       "Zuständig für das Spielablauf:<br>"+
                                       "   XXX<br>"+
                                       "<br>"+
                                       "Zuständig für das Dateimanagement:<br>"+
                                       "   XXX</body></html>");
                                       panel2.add(label2);
                                       label2.setBounds(5, 40, 600, 500);
                Font creditsText = new Font("Serif", Font.PLAIN + Font.ITALIC, 25);
                label2.setFont(creditsText);
                label2.setForeground(Color.gray);
            }
        }
        );
        button4.addActionListener(new ActionListener()
        {
            //Ein Dialogfenster für das Beenden des Programms, mit der Auswahl ja / nein(Anton Stepin)
            public void actionPerformed(ActionEvent e)
            {
                int response = JOptionPane.showConfirmDialog(null, "Wollen Sie das Spiel wirklich beenden?", 
                "Wirklich???", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
             
                if(response == 0)
                {
                    System.exit(0);
                }
            }
        });
     }
 }
 
Zuletzt bearbeitet von einem Moderator:
Geht das ganze vielleicht mit getter/ setter Methoden? Also dass ich von der Klasse Menue auf das Objekt panel der Klasse KFrame zugreifen kann/ es mir in die Klasse Menue hole?
 
das geht, ja,
zumindest als grundsätzlicher Weg, mit tausenden Problemen am Wegesrand

an sich eine sehr einfache Sache ohne die fast kein Programm funktioniert,

------

sonstige Anmerkungen:
createFrame():
setVisible(true); aufs JFrame besser erst ganz zum Schluss, wenn alles andere eingefügt ist

------

> panel.setLayout(null);
ein einfaches add() wird bei null-Layout nicht ausreichen, allerdings klingt '120,50,100,200' beim Button nach den nötigen Bounds

---------

> add(spielstart);// hier wird der Button Spielstart dem Panel NICHT zugewiesen ...
> spielstart.createButton();

spielstart mag ein JPanel sein, dann gehts vielleicht, sonst komisches Konstrukt,
was wird geadded wenn der Button, der spielstart angeblich sein soll, erst danach intern erzeugt wird?

bei KLabel usw. ähnlich,
warum erbt eigentlich Menue von JPanel, wird das auch irgendwo eingefügt? auf solche Punkte unbedingt achten,
lieber zu wenig als zu viel erben
 
Hmm danke für die Antworten. Das mit dem spielstart.createButton ist einfach ausversehen nach unten gerutscht durch 100-faches rumprobieren. es war vorher über dem add(spielstart). Mein Problem ist einfach dass ich die Button bzw. Labels nicht in das Panel bekomme, da mir der zugriff fehlt.
 
also hauptfenster.getPanel().add(..)
mit entsprechendener getPanel()-Methode

oder vielleicht eher
hauptfenster.addToYourPanel(xy);
 

Neue Themen


Zurück
Oben