Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes

Diskutiere Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes im Java Basics - Anfänger-Themen Bereich.
P

PinkMuffin

Hallo,
ich habe ein Problem mit der Erreichbarkeit meiner Variablen und Methoden.. Hab schon überlegt, ob es daran liegt, dass ich manche der Klassen eine Extension von JPanel sind, aber wüsste dann nicht, wie ich es anders lösen sollte:

2020-08-31 12_53_46-Window.png
In meinem Panel hab ich die Variablen angelegt (nutzerName und nutzer sind für die Fragestellung wichtig)
Ich hab sie zum Testen nicht einmal auf private gestellt (ich weiß, soll man nicht so machen, aber ich wollte ausprobieren, ob ich dann eher drauf zugreifen kann)

2020-08-31 12_53_25-Window.png
Dann hab ich das TextFeld initialisiert und mein getter sollte (meinem Verständnis nach) das Eingeben, was der User in das Textfeld schreibt.

2020-08-31 12_52_53-Window.png

Allerdings kann ich in meiner Klasse, in der ich ja ein Objekt vom Typ Login habe, nicht auf die Methoden/Variablen/etc zugreifen.
Dieses Problem hatte ich schon an mehreren Stellen im Code, habe es dann allerdings extrem unschön gelöst (indem ich die Klassen alle in das selbe Fenster wie die Hauptklasse (Deck) geschrieben habe..

Wenn jemand weiß, wie das sinnvoller geht, wäre mir sehr geholfen :D
LG
Lena
 
P

PinkMuffin

Dankeschön, mit der Dokumentation hatte ich die meisten Sachen in den letzten Tagen erarbeitet. Allerdings sind bei mir ja alle modifier auf public oder package-private.. Gelten diese Modifier in genau der gleichen Weise auch für extended Klassen? Weil irgendwie habe ich dieses Problem erst, seit ich Java.Swing benutze und alle Variablen in irgendeiner Weise einem Frame/Panel zugeordnet sind.
 
H

httpdigest

Gelten diese Modifier in genau der gleichen Weise auch für extended Klassen?
Wenn du damit Subklassen (in der Dokumentation mit "Subclass" bezeichnet) meinst, also Klassen, die explizit von einer anderen Klasse als java.lang.Object ableiten, dann steht das alles auch in der Dokumentation. Faktisch gibt es in Java keine "nicht-ableitenden" Klassen. Alle leiten implizit von java.lang.Object ab, wenn nicht anders angegeben.
Aber die Zugriffsbeschränkungen ändern sich natürlich nicht für andere Klassen ausserhalb der Ableitungshierarchie/Klassenhierarchie, wenn du plötzlich von irgendeiner Klasse ableitest.
 
P

PinkMuffin

Aber die Zugriffsbeschränkungen ändern sich natürlich nicht für andere Klassen ausserhalb der Ableitungshierarchie/Klassenhierarchie, wenn du plötzlich von irgendeiner Klasse ableitest.
Okay, wenn es keinen Unterschied macht, von welcher Klasse ich ableite, dann kann es nicht an den modifiern liegen, denn die sind alle auf public, sollten also über das Objekt erreichbar sein..
 
J

JustNobody

Zeig doch einmal die ganze Klasse, in der Du Login nutzt.
So Du in Login eine public Methode hast, dann kannst Du diese auch aufrufen.

Was für eine Fehlermeldung kommt genau? Evtl. hilft diese weiter.

Typische Probleme könnten sein:
- Die Variable ist von einem anderen Typ (also z.B. eine andere Login Klasse aus einem anderen Package oder Du hast die Instanz von Login einem JPanel oder so zugewiesen. Also Imports und Deklaration der Variable prüfen.)
- Evtl. hat die IDE auch ein Problem. Dann ggf. einmal clean und neu bauen. (Sowas habe ich hier bezüglich Eclipse schon gelesen, ich selbst nutze Eclipse nicht)

Das wären so die Ideen, die ich habe. Evtl. auch einmal ruhig das ganze Projekt nach einem clean zippen und das ZIP File bereit stellen - dann muss man nicht groß raten sondern kann schauen.
 
P

PinkMuffin

Java:
public class Deck
{
    JFrame frame;
    JPanel deck, login, fragePanel, ranking;
    CardLayout card;
    JButton highscore, restart, play, exit, beenden;
    int punkte=0;
    String nutzername;
    JLabel rankingLabel = new JLabel();

    public Deck()
    {
        frame = new JFrame("Swing - Quiz");
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        deck = new JPanel();
        DerHandler handler = new DerHandler();

        //Buttons erzeugen
        play = new JButton("Play");
        restart = new JButton("Restart");
        restart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                login = new Login();
                card.show(deck, "Login");
            }
        });
        play.addActionListener(handler);

        exit = new JButton("Exit");
        exit.addActionListener(new ActionListener()
        {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
        });

        beenden = new JButton("Beenden");
        beenden.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

        highscore = new JButton("Highscore");
        highscore.addActionListener(handler);

        //An dieser Stelle werden die anderen Panels erzeugt
        login = new Login();
        login.add(exit);
        login.add(play);

        ranking = new JPanel();
        ranking.setLayout(new BoxLayout(ranking, BoxLayout.Y_AXIS));
        ranking.add(rankingLabel);
        rankingLabel.setHorizontalAlignment(SwingConstants.LEFT);
        rankingLabel.setHorizontalTextPosition(SwingConstants.LEFT);
        JPanel rankingButtons = new JPanel();
        rankingButtons.add(restart);
        rankingButtons.add(beenden);
        ranking.add(rankingButtons);

        fragePanel = new Fragen();

        card = new CardLayout();
        //Panels werden dem CardLayout zugefügt
        deck.setLayout(card);
        deck.add(login, "Login");
        deck.add(fragePanel, "Fragen");
        deck.add(ranking, "Ranking");

        frame.add(deck);
        frame.setVisible(true);
        frame.pack();
    }


    public class Fragen extends JPanel
    {
        ArrayList<String> fragen;
        ArrayList<String> antwort;
        ArrayList<String> f1,f2,f3;
        JButton b1,b2,b3,b4;
        JLabel frage;
        JPanel br1, br2;
        ArrayList<JButton> buttons;
        JButton rAntwort;

        public Fragen()
        {
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            frage = new JLabel();
            fragen = new ArrayList<String>();
            fragen.add("Wie viele Pflanzen stehen bei Sabrina?");
            fragen.add("Wie heißt der Hund von Ralf Weinmann?");
            fragen.add("Welche Farbe hat das cortility Logo (Außer schwarz)?");
            antwort = new ArrayList<String>();
            antwort.add("8");
            antwort.add("Zoey");
            antwort.add("magenta");

            f1 = new ArrayList<String>();
            f1.add("5");
            f1.add("Martha");
            f1.add("gelb");

            f2 = new ArrayList<String>();
            f2.add("3");
            f2.add("Marley");
            f2.add("blau");

            f3 = new ArrayList<String>();
            f3.add("6");
            f3.add("Bello");
            f3.add("Es ist nur schwarz.");

            b1 = new JButton();
            b2 = new JButton();
            b3 = new JButton();
            b4 = new JButton();

            buttons = new ArrayList<JButton>();
            buttons.add(b1);
            buttons.add(b2);
            buttons.add(b3);
            buttons.add(b4);
            zuordnen();
            br1 = new JPanel();
            br2 = new JPanel();

            this.add(frage);
            this.add(br1);
            this.add(br2);
            br1.add(b1);
            br1.add(b2);
            br2.add(b3);
            br2.add(b4);

            /*this.add(buttons.get(0));
            this.add(buttons.get(1));
            this.add(rAntwort);
            this.add(buttons.get(2));*/



        }


        public void zuordnen()
        {
            DerHandler handler = new DerHandler();
            int random = (int) (Math.random()*3);
            int frageRandom = (int) (Math.random()*3);
            String antwort1 = antwort.get(frageRandom);
            antwort.remove(frageRandom);
            String falsch1 = f1.get(frageRandom);
            f1.remove(frageRandom);
            String falsch2 = f2.get(frageRandom);
            f2.remove(frageRandom);
            String falsch3 = f3.get(frageRandom);
            f3.remove(frageRandom);

            String frageTitel = fragen.get(frageRandom);
            fragen.remove(frageRandom);

            frage.setText(frageTitel);

            rAntwort = buttons.get(random);
            buttons.remove(random);
            rAntwort.setText(antwort1);

            buttons.get(0).setText(falsch1);
            buttons.get(1).setText(falsch2);
            buttons.get(2).setText(falsch3);

            rAntwort.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e) {
                    deck.remove(fragePanel);
                    fragePanel = new Fragen();
                    deck.add(fragePanel, "Fragen");
                    card.show(deck, "Fragen");
                    punkte++; //schon mit einem getter/setter ausprobiert, passiert das gleiche
                    rankingLabel.setText(login.getNutzer() + punkte); //Hier findet es die methode nicht
                }
            });


            for (int i=0; i<buttons.size(); i++)
            {
                buttons.get(i).addActionListener(new ActionListener()
                {
                    @Override
                    public void actionPerformed(ActionEvent e)
                    {
                        //Auch wenn ich in dieser Methode den Punktestand überschreibe, wird 0 ausgegeben
                        rankingLabel.setText(login.getNutzer() + punkte);//Hier findet es die methode nicht
                        card.show(deck, "Ranking");

                    }
                });

            }

        }


    }


    public class DerHandler implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent event)
        {
            if (event.getSource()== highscore)
            {

                card.show(deck, "Ranking");
            }
            else if (event.getSource()== play)
            {
                card.show(deck, "Fragen");
            }

        }
    }
}
Die Fehlermeldung ist in der Methode zuordnen(). (relativ weit unten). Sie lautet: Cannot ressolve method 'getNutzer' in JPanel.
(Ich weiß, das die Struktur sehr chaotisch ist und ich die Klassen eigentlich auslagern müsste, allerdings habe ich dieses Problem bei sehr vielen Stellen und konnte es dadurch lösen, die Klassen alle am selben Ort zu deklarieren. Wenn ich jetzt exemplarisch bei der login Klasse herausfinde, woran es liegt, werde ich die anderen Klassen (Fragen()) auch auslagern).

Code:
public class Login extends JPanel {
    JPanel titlePanel;
    JPanel eingabePanel;
    JPanel textPanel;
    JPanel buttonPanel;
    JTextField nutzerName;
    String nutzer;
    Dimension tf = new Dimension(300, 15);

    public Login()
    {
        super();
        titlePanel = new JPanel();
        textPanel = new JPanel();
        buttonPanel = new JPanel();
        eingabePanel = new JPanel();
        nutzerName = new JTextField();

        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        //JLabel formatieren
        JLabel title = new JLabel("Das Quiz");
        title.setHorizontalAlignment(SwingConstants.LEFT);

        JLabel eingabeAufforderung = new JLabel("Geben Sie Ihren Benutzer ein:");
        eingabePanel.setLayout(new BoxLayout(eingabePanel, BoxLayout.Y_AXIS));
        eingabeAufforderung.setHorizontalAlignment(SwingConstants.LEFT);
        nutzerName = new JTextField(1);
        nutzerName.setMaximumSize(tf);
        titlePanel.add(title);
        eingabePanel.add(eingabeAufforderung);
        eingabePanel.add(nutzerName);
        this.add(titlePanel);
        this.add(eingabePanel);


    }

    public String getNutzer() {
         return nutzer = nutzerName.getText();
    }
}
Vielen Dank für deine Vorschläge bisher. Andere Login-Klassen hatte ich schon vorher gelöscht, die Variable ist eigentlich auch ausschließlich als Panel deklariert und wird danach auch nicht mehr zugewiesen. Das mit dem IDE kann sein, würde mich allerdings wundern, bisher war noch immer ich das Problem 😅, ich nutze allerdings auch Intellij und nicht Eclipse
 
mrBrown

mrBrown

Sie lautet: Cannot ressolve method 'getNutzer' in JPanel.
Das stimmt ja auch – login ist als JPanel deklariert, das hat diese Methode nicht ;)

Wenn du es so belassen willst, deklarier login als Login statt als JPanel, besser wäre aber ein Muster wie MVC zur Trennung zu verwenden.
 
P

PinkMuffin

Das stimmt ja auch – login ist als JPanel deklariert, das hat diese Methode nicht ;)

Wenn du es so belassen willst, deklarier login als Login statt als JPanel, besser wäre aber ein Muster wie MVC zur Trennung zu verwenden.
Ich weiß nicht, ob ich frustriert oder erleichtert sein soll, dass es immer so dämliche Fehler sind ^^ (alle anderen Fehler, sind nämlich durch meine Massendeklaration am Anfang vermutlich ganz genauso entstanden)
Danke für den Hinweis mit dem MVC, das sieht aus, als wäre es sinnvoll, sich damit mal näher zu befassen 😊
 
B

BestGoalkeeper

@PinkMuffin Wie dir bereits geschrieben wurde, solltest du jeden relevanten Code hier in Textform posten. Das geht folgendermaßen, Zahnrädchensymbol oben rechts klicken, [code=java][/code] schreiben und in den Tags deinen Code einfügen. Weiterhin solltest du nur den fehlerhervorrufenden Teil posten, ein so genanntes SSCCE, damit jeder den Fehler nachvollziehen kann, und außerdem eine genau Fehlermeldung und Beschreibung (ggf. Zeile und Stacktrace) angeben. Zudem das was du versucht hast und das wie es eigentlich sein sollte (Ist und Soll Beschreibung).
 
Thema: 

Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben