Von einer anderen Klasse auf JTextField zugreifen

Panikmeister

Mitglied
Hi, ich sitze grad an nem Java-Spiel und habe ein Problem, an dem ich schon seit Stunden sitze und es einfach nicht auf die Reihe bekomme 🙁

Es gibt eine GUI-Klasse "NewGame":

Java:
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class NewGame extends JFrame  {

    
    private static final long serialVersionUID = -8008194757837145061L;
    public JTextField playerName1;
    
    public NewGame() {
        
        super("Neues Spiel");
        String[] colors = {"Grün", "Rot", "Blau", "Gelb", "Schwarz", "Weiß"}; 
        setSize(530,300);
        setLayout(null);
        JLabel label = new JLabel("Bitte Spieler eingeben!");
        Font fontNewGame = new Font("Arial", Font.BOLD, 18);
        label.setBounds(180, 0, 300, 40);
        add(label);
        JLabel label2 = new JLabel("Name");
        label2.setBounds(60, 25, 40, 40);
        add(label2);
        JLabel label3 = new JLabel("Farbe");
        label3.setBounds(450, 25, 40, 40);
        add(label3);
        label.setFont(fontNewGame);
        //Die 4 Eingabe-Felder für die Namen
        final JTextField playerName1 = new JTextField("adsasd");
        playerName1.setBounds(10, 60, 140, 40);
        add(playerName1);
        final JTextField playerName2 = new JTextField();
        playerName2.setBounds(10, 110, 140, 40);
        add(playerName2);
        final JTextField playerName3 = new JTextField();
        playerName3.setBounds(10, 160, 140, 40);
        add(playerName3);
        final JTextField playerName4 = new JTextField();
        playerName4.setBounds(10, 210, 140, 40);
        add(playerName4);
        //Wenn alles eingegeben wurde, startet man das Spiel mit diesem Button
        [B]JButton start = new JButton("Start");
        start.setBounds(160, 60, 240, 40);
        start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //hier soll ein neuer Player erstellt werden...Player player = new Player(arg1, arg2, arg3);
            }
        });[/B]
        add(start);
        //2.Spieler Auswahl, ob PC-Gegner, Mensch-Gegner oder inaktiv
        //listeners einfügen, wenn buttongroup auf inaktiv -> grau machen
        JRadioButton mensch1 = new JRadioButton("Mensch");
        mensch1.setBounds(160, 110, 80, 40);
        add(mensch1);
        JRadioButton pc1 = new JRadioButton("PC");
        pc1.setBounds(250, 110, 80, 40);
        add(pc1);
        JRadioButton inaktiv1 = new JRadioButton("inaktiv");
        inaktiv1.setBounds(340, 110, 80, 40);
        add(inaktiv1);
        ButtonGroup bg1 = new ButtonGroup();
        bg1.add(mensch1);
        bg1.add(pc1);
        bg1.add(inaktiv1);
        
        
        //3.Spieler Auswahl, ob PC-Gegner, Mensch-Gegner oder inaktiv
        JRadioButton mensch2 = new JRadioButton("Mensch");
        mensch2.setBounds(160, 160, 80, 40);
        add(mensch2);
        JRadioButton pc2 = new JRadioButton("PC");
        pc2.setBounds(250, 160, 80, 40);
        add(pc2);
        JRadioButton inaktiv2 = new JRadioButton("inaktiv");
        inaktiv2.setBounds(340, 160, 80, 40);
        add(inaktiv2);
        ButtonGroup bg2 = new ButtonGroup();
        bg2.add(mensch2);
        bg2.add(pc2);
        bg2.add(inaktiv2);
        //4.Spieler Auswahl, ob PC-Gegner, Mensch-Gegner oder inaktiv
        JRadioButton mensch3 = new JRadioButton("Mensch");
        mensch3.setBounds(160, 210, 80, 40);
        add(mensch3);
        JRadioButton pc3 = new JRadioButton("PC");
        pc3.setBounds(250, 210, 80, 40);
        add(pc3);
        JRadioButton inaktiv3 = new JRadioButton("inaktiv");
        inaktiv3.setBounds(340, 210, 80, 40);
        add(inaktiv3);
        ButtonGroup bg3 = new ButtonGroup();
        bg3.add(mensch3);
        bg3.add(pc3);
        bg3.add(inaktiv3);
        
        JSpinner spin1 = new JSpinner(new SpinnerListModel(colors));
        spin1.setBounds(420, 65, 85, 35);
        add(spin1);
        JSpinner spin2 = new JSpinner(new SpinnerListModel(colors));
        spin2.setBounds(420, 115, 85, 35);
        add(spin2);
        JSpinner spin3 = new JSpinner(new SpinnerListModel(colors));
        spin3.setBounds(420, 165, 85, 35);
        add(spin3);
        JSpinner spin4 = new JSpinner(new SpinnerListModel(colors));
        spin4.setBounds(420, 215, 85, 35);
        add(spin4);
        
        setVisible(true);
    }   
}

Bei Klick auf den "Start-Button" JButton start sollen die Werte aus den TextFeldern ausgelesen werden und ein neuer Spieler erstellt werden (Player-Klasse vorhanden).

Das Problem ist nur, dass ich die ausgelesenen Werte nicht von einer anderen Klasse auslesen kann.
Wenn ich mit dem ActionListener(Fettschrift) einen neuen Spieler erstellt habe, kann ich die Instanz nicht von der Hauptklasse benutzen 🙁

Ich hab stundenlang gegoogled, aber es passt wirklich nichts, da mein Programmaufbau doch irgendwie ziemlich anders ist.


Wie krieg ich das nun hin? Hab schon diverse getter-Methoden probiert etc.
 
was genau funktioniert denn nicht, du schreibst so viel und läßt doch entscheidende Infos einfach weg,
in dem von dir markieren ActionListener könnte wunderbar die Zeile
Java:
String name = playerName1.getText();
stehen, da playerName1 sogar schon passend final ist,
genauso kannst du noch mehr lesen und die Strings an Player übergeben,

was geht daran nicht, was ist dein anderes Ziel?
wenn du verrückterweise die Textfelder an den Player-Konstruktor übergeben möchtest, dann ginge auch das,

wenn du gar nichts an Player übergibst, hätte diese andere Klasse in der Tat Probleme, auf die Textfelder von NewGame zuzugreifen,
die müssten dann Instanzattribute mit vorhandenen getter-Methoden sein, was ein wenig an deine stundenlangen Versuche erinnert, von denen aber nichts zu sehen ist und zu denen du nichts verrätst,
zum empfehlen ist all das nicht, lieber die Strings an Player übergeben
 
> Wenn ich mit dem ActionListener(Fettschrift) einen neuen Spieler erstellt habe, kann ich die Instanz nicht von der Hauptklasse benutzen

ok, bisschen lesen würde auch mir helfen, auch wenn das ein wenig dem Titel widerspricht,
du kannst also einen Player anlegen? dann speichere ihn in einem Instanzattribut von Newgame
 
Java:
start.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Player player1 = new Player(playerName1.getText(), "bla", 10);
                player1.toString();
            }
        });;

Wenn ich den Start-Button drücke, wird dieser Listener ausgeführt. Das Player-Objekt wird auch korrekt erstellt (das toString() ist aus Testzwecken).

ich kann nur leider nicht aus der Hauptklasse auf dieses grad erstellte player1 Objekt zugreifen.

"player1 cannot be resolved"...


edit: hatte deinen post von vor 2 mins noch nicht gesehen ;-)
 
Ich kann nichtmal auf eine Instanz der GUI zugreifen von einer anderen Klasse...wie ist das mit dem Instanzattribut gemeint? Ich steh grad aufm Schlauch...
 
im ActionListener schreibe
[c]player1 = new Player(playerName1.getText(), "bla", 10);[/c]
statt
[c]Player player1 = new Player(playerName1.getText(), "bla", 10);[/c]
wenn ein entsprechenes Instanzattribut player1 angelegt ist (so wie Zeile 11), das funktioniert schon

aber wo willst du darauf zugreifen? nicht im restlichen Konstruktor, der dein gesamtes Posting ausfüllt,
dieser ist nach wenigen ms fertig, lange bevor die GUI zu sehen oder der Button gedrückt ist
 
Das Instanzattribut ist ohne Getter/Setter dazu nur in dem jeweiligen Objekt gültig in dem es verwendet wird. Damit deine Hauptklasse als den erzeugen Player kennen kann, muß die Klasse NewGame der Hauptklasse das irgendwie mitteilen. Z.B. durch einen entsprechenden Setter in der Hauptklasse, z.B. setNewPlayer(...), setActualPlayer(...). Dazu muß NewGame auch ein Objekt der Hauptklasse kennen.
Du kannst Du das auch mit Listenern machen.
 
@SlaterB ich denke das Problem ist, das er mehrere Klassen hat. Hauptklasse und NewGame, er möchte jetzt wissen, wie er in der Hauptklasse auf player1 aus NewGame zugreifen kann.
 
Java:
public class MADN {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        MainWindow mainwindow = new MainWindow();
        
       
        
    }
}

Das ist meine Hauptklasse. Wenn man im MainWindow auf "Neues Spiel" drückt, wird eine neue Instanz vom NewGame-Fenster erstellt erstellt.

Java:
NewGame newgame = new NewGame();

Ich hab jetzt irgendwelche getter und setter Kombinationen ausprobiert, bekomme aber immer noch "cannot be resolved" in der MADN-Klasse.

Das ist übrigends die Player-Klasse:

Java:
public class Player {

    private String name = " ";
    private String color = " ";
    private int highscore = 0;
    
    public Player(String name, String color, int highscore) {
        
        this.name = name;
        this.color = color;
        this.highscore = highscore;
        
    }
    
    public String toString() {
        
        String strPlayer = this.name + "     " + this.highscore;
        System.out.println(strPlayer);
        return strPlayer;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public int getHighscore() {
        return highscore;
    }
}

Hauptklasse und NewGame, er möchte jetzt wissen, wie er in der Hauptklasse auf player1 aus NewGame zugreifen kann.

Genau!
 
ich frage mich immer noch was das mit dem Titel des Themas zu tun hat..

also mal logisch überlegt:
lokal im ActionListener kann man dem Player-Objekt wenig anfangen,
es in einem Attribut von NewGame zu speichern sollte nun klar sein,

wenn jemand ein/das NewGame-Objekt kennt, dann sollte er mit einem passenden getter dieses Attribut abfragen können,
wenn jemand nichtmal das NewGame-Objekt kennt, dann muss derjenige irgendjemand fragen bis das NewGame-Objekt da ist, dort dann Player abfragen

wo sind bei all diesen Überlegungen auch nur eine Spur von Problemen?
wo hast du schon einen getter ausprobiert? was genau ging da nicht?

nur player1 zu schreiben wer weiß wo in der Welt, das geht natürlich nicht
 
Java:
System.out.println(mainwindow.getNewgame().getPlayer1().toString());

damit konnte ich jetzt von der Hauptklasse auf den erstellten Spieler zugreifen.

allerdings müsste ich noch von der GameTable-Klasse auf den Spieler zugreifen.

die GameTable-Klasse wird von NewGame erstellt.


MADN->MainWindow->NewGame->GameTable
 
wie gesagt: wer immer Player nicht kennt, muss NewGame danach fragen,
wer auch NewGame nicht kennt, muss z.B. die Hauptklasse kennen und dort NewGame abfragen können,
statt über 3 auch über 5 oder 70 Stationen, es ist alles dasselbe

immer jemanden fragen der das gewünschte oder ein Schritt dahin liefern kann,
wenn GameTable gar niemand kennt, dann eine Referenz auf irgendwas von außen übergeben,
entweder anfangs im Konstruktor oder später per Methode,

grundsätzliche Alternative dazu sind nur statische Variablen/ Methoden als globaler Zugann
 
Danke Euch erstmal für die vielen Anregungen!

Ich habs jetzt so gelöst, dass ich in der Hauptklasse ne Methode startGame() erstellt habe, die die Player-Objekte etc als Argumente übergeben bekommt.

Klappt auch alles!
 

Zurück
Oben