Action Listener Rückgabewert

JnG

Mitglied
Guten Tag,
mein Name ist Dennis und ich habe ein Problem! Ich will aus einer anderen klasse auf eine im ActionListener liegende variable zugreifen. Ich bin noch recht neu und weiß nicht wie das geht. Ich würde gerne aus der Eingabe klasse auf den ActionListener aus der Buttons klasse zugreifen und den neuen result wert als Eingabe nutzen und ausgeben!
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Eingabe {

    private FileWriter fw;
    private BufferedWriter bw;
    private FileReader fr;
    private BufferedReader br;
  
    JButton we1 = new JButton("Temp");
  
    JFrame WindowWetten = new JFrame();
  
    JButton wetten = new JButton("Wetten");  
    public Eingabe() throws IOException {

        fw = new FileWriter("eingabe.txt");
        bw = new BufferedWriter(fw);
        fr = new FileReader("eingabe.txt");
        br = new BufferedReader(fr);

    }

    public void SpielerEingabe() throws IOException {

        bw.write("Jakob");
        bw.close();

    }
  
    public Component Wetten() throws IOException {
        Buttons b1 = new Buttons();
        we1.setBounds(100, 100, 100, 50);
        we1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Hey " + b1.result);
              
            }
        });
        return we1;
      
    }

    public String SpielerAusgabe() throws IOException {

        String zeile1 = br.readLine();
        System.out.println(zeile1);
        br.close();
        return zeile1;
    }

}
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Buttons {
  
    JButton wetten = new JButton("Wetten");
  
    JButton p1_1 = new JButton("+1");
    JButton p1_2 = new JButton("+1");
    JButton p1_3 = new JButton("+1");
    JButton p2_1 = new JButton("+1");
    JButton p2_2 = new JButton("+1");
    JButton p2_3 = new JButton("+1");
  
    JFrame WindowWetten = new JFrame();
  
    Listener1 list1 = new Listener1();
    Listener2 list2 = new Listener2();
    Listener3 list3 = new Listener3();
    Listener4 list4 = new Listener4();
    Listener5 list5 = new Listener5();
    Listener6 list6 = new Listener6();
  
    Label l1_1 = new Label();
    Label l1_2 = new Label();  
    Label l1_3 = new Label();
    Label l2_1 = new Label();
    Label l2_2 = new Label();  
    Label l2_3 = new Label();
  
    Labels1 l1 = new Labels1();
  
    Font bold = new Font("Helvetica", Font.BOLD, 19);
  
    public Buttons() throws IOException {

    }

  
    public Component wettenButton() {
      
        wetten.setBounds(450, 400, 100, 30);
      
      
        wetten.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
              

              
                WindowWetten.setSize(400, 500);
                WindowWetten.setLayout(null);
                WindowWetten.setLocationRelativeTo(null);
                WindowWetten.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                WindowWetten.setResizable(true);
                WindowWetten.setVisible(true);
              
              
            }
        });
      
        return wetten;
      
      
    }
  
    //***************************************//
    //***************************************//
  
        public Component l1_1(){
            l1_1.setBounds(250, 195, 45, 35);
            l1_1.setBackground(Color.white);
            return l1_1;
        }
      
        public Component l1_2(){
            l1_2.setBounds(250, 245, 45, 35);
            l1_2.setBackground(Color.white);
            return l1_2;
        }
      
        public Component l1_3() {
            l1_3.setBounds(250, 295, 45, 35);
            l1_3.setBackground(Color.white);
            return l1_3;
        }
  
        public Component l2_1(){
            l2_1.setBounds(705, 195, 45, 35);
            l2_1.setBackground(Color.white);
            return l2_1;
        }
      
        public Component l2_2(){
            l2_2.setBounds(705, 245, 45, 35);
            l2_2.setBackground(Color.white);
            return l2_2;
        }
      
        public Component l2_3() {
            l2_3.setBounds(705, 295, 45, 35);
            l2_3.setBackground(Color.white);
            return l2_3;
        }
  
    //***************************************//
    //***************************************//
  
        public Component player1_1() {
            p1_1.setBounds(100, 200, 50, 20);
            p1_1.addActionListener(list1);
            return p1_1;
          
        }
      
        public Component player1_2() {
            p1_2.setBounds(100, 250, 50, 20);
            p1_2.addActionListener(list2);
            return p1_2;
          
        }
      
        public Component player1_3() {
            p1_3.setBounds(100, 300, 50, 20);
            p1_3.addActionListener(list3);
            return p1_3;
          
        }
      
        public Component player2_1() {
            p2_1.setBounds(850, 200, 50, 20);
            p2_1.addActionListener(list4);
            return p2_1;
          
        }
      
        public Component player2_2() {
            p2_2.setBounds(850, 250, 50, 20);
            p2_2.addActionListener(list5);
            return p2_2;
          
        }
      
        public Component player2_3() {
            p2_3.setBounds(850, 300, 50, 20);
            p2_3.addActionListener(list6);
            return p2_3;
          
        }

        //******************************************//
        //******************************************//
      
        public static void main(String[] args) throws IOException {
            Windows w1 = new Windows();
            w1.WindowMainOpen();
        }
      
        String temp = "";
        String sign = "";
        double result = 0;
        String temp2 = "";
        double result2 = 0;
        String temp3 = "";
        double result3 = 0;
        String temp4 = "";
        double result4 = 0;
        String temp5 = "";
        double result5 = 0;
        String temp6 = "";
        double result6 = 0;
        String ab = "";      
      
    public class Listener1 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp = String.valueOf(1);
                    sign="+";
                    result = Double.parseDouble(temp)+result;
                    l1_1.setFont(bold);
                    l1_1.setText(String.valueOf(result));
                    System.out.println("Result: " + result);
                  
                }
              
            }
          
          
    }
      
        public class Listener2 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp2 = String.valueOf(1);
                    sign="+";
                    result2 = Double.parseDouble(temp2)+result2;
                    l1_2.setFont(bold);
                    l1_2.setText(String.valueOf(result2));
                    System.out.println("temp2 - result2" + result2);
                }
              
            }
          
          
        }
      
        public class Listener3 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp3 = String.valueOf(1);
                    sign="+";
                    result3 = Double.parseDouble(temp3)+result3;
                    l1_3.setFont(bold);
                    l1_3.setText(String.valueOf(result3));
                    System.out.println("temp3 - result3" + result3);
                }
              
            }
          
          
        }
      
        public class Listener4 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp4 = String.valueOf(1);
                    sign="+";
                    result4 = Double.parseDouble(temp4)+result4;
                    l2_1.setFont(bold);
                    l2_1.setText(String.valueOf(result4));
                    System.out.println("temp4 - result4" + result4);
                }
              
            }
          
          
        }
      
        public class Listener5 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp5 = String.valueOf(1);
                    sign="+";
                    result5 = Double.parseDouble(temp5)+result5;
                    l2_2.setFont(bold);
                    l2_2.setText(String.valueOf(result5));
                    System.out.println("temp5 - result5" + result5);
                }
              
            }
          
          
        }
      
        public class Listener6 implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
              
                String cmd = e.getActionCommand();                  
                System.out.println(cmd);
              
                if(cmd=="+1") {
                    temp6 = String.valueOf(1);
                    sign="+";
                    result6 = Double.parseDouble(temp6)+result6;
                    l2_3.setFont(bold);
                    l2_3.setText(String.valueOf(result6));
                    System.out.println("temp6 - result6" + result6);
                }
              
            }
          
          
        }

  

}
 
Zuletzt bearbeitet von einem Moderator:
Erkläre doch am besten wo genau dein Problem liegt. Wo willst du auf welche Variable zugreifen? (raten wollen wir hier nicht)

Zu deinem Code: Vergib den Klassen, Methoden und Variablen sprechende Namen (und lasse die "_" weg)! Dass macht es leichter deinen Code zu lesen und zu verstehen.
Methoden beschreiben Tätigkeiten genauer, sprich statt player1_3 sollte die Methode besser getPlayer1Button3 heißen.
Deine 6 Listener machen alle so ziemlich das selbe, einzig das andere Variablen verwendet werden. Schreibe stattdessen doch nur eine Klasse welche das gewünschte erledigt und erstelle davon mehrere Objekte. Beispiel:
Java:
public class MyListener implement ActionListener {

   private double result = 0;
   
   private JLabel label;
   
   public MyListener(JLabel label) {
       this.label = label;
   }
   
   @Override
   public void actionPerformed(ActionEvent e) {
       String cmd = e.getActionCommand();
       System.out.println(cmd);
   
       if(cmd.equals("+1")) {
           result += 1.0;
           label.setFont(bold);
           label.setText(String.valueOf(result));
           System.out.println("temp - result" + result);
       }
   }
   
   public double getResult() {
       return result;
   }
}

Strings werden mit equals nicht mit == verglichen!
 
Danke erstmal für die Antwort. Ich werde das ändern und die buttons etc. umbenennen. Mein Problem ist das ich wenn ich aus der Eingabe klasse auf das result der Buttons klasse zugreife immer nur den vorher festgelegten wert "0" bekomme.
 
Wo fügst du die Buttons aus deiner Buttons Klasse deiner GUI hinzu? Aus deinem Code ist das nicht ersichtlich, somit kann ich auch nicht sagen ob die Listener ausgeführt werden und sich result jemals ändert.
 
Dies tue ich in meiner Windows klasse.
Java:
import java.awt.Color;
import java.io.IOException;

import javax.swing.JFrame;

public class Windows {

    JFrame WindowMain = new JFrame();
    JFrame WindowWetten = new JFrame();
    TxtFields pl1 = new TxtFields();
    TxtFields pl2 = new TxtFields();
    Labels lvs = new Labels();
    Buttons wb1 = new Buttons();
    Eingabe eg = new Eingabe();
   
    public Windows() throws IOException {

    }
   
    public void WindowMainOpen() throws IOException {
       
        WindowMain.setSize(1000, 600);
        WindowMain.setLayout(null);
        WindowMain.setLocationRelativeTo(null);
        WindowMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        WindowMain.setResizable(true);
        WindowMain.getContentPane().setBackground(Color.gray);
       
        WindowMain.getContentPane().add(pl1.player1());
        WindowMain.getContentPane().add(pl2.player2());
        WindowMain.getContentPane().add(lvs.labelVs());
       
        WindowMain.getContentPane().add(wb1.wettenButton());
       
        WindowMain.getContentPane().add(eg.Wetten());
       
        WindowMain.getContentPane().add(wb1.player1_1());
        WindowMain.getContentPane().add(wb1.player1_2());
        WindowMain.getContentPane().add(wb1.player1_3());
       
        WindowMain.getContentPane().add(wb1.player2_1());
        WindowMain.getContentPane().add(wb1.player2_2());
        WindowMain.getContentPane().add(wb1.player2_3());
       
        WindowMain.getContentPane().add(wb1.l1_1());
        WindowMain.getContentPane().add(wb1.l1_2());
        WindowMain.getContentPane().add(wb1.l1_3());
       
        WindowMain.getContentPane().add(wb1.l2_1());
        WindowMain.getContentPane().add(wb1.l2_2());
        WindowMain.getContentPane().add(wb1.l2_3());
       
        WindowMain.setVisible(true);
       
       
    }
   
   
}
 
Ist ja auch logisch. Du erstellt in der Klasse "Windows" ein Objekt deiner Buttons Klasse und fügst diese Buttons deinem JFrame hinzu.
In der Klasse Eingabe erstellst du auch ein Objekt deiner Buttons Klasse und greifst auf dessen "result" zu. Diese kann aber nie verändert werden da dessen Buttons nicht angezeigt werden (und somit auch ned ausgelöst werden können).

Große Anmerkung zu deinem Code: Es ist ein schlechter Stil für die unterschiedlichen Componenten jeweils eine Klasse zu machen. Erstelle lieber eine Klasse um ein JFrame bzw. JPanel zu beschreiben (mit allen benötigten Komponenten).

Lösung zu deinem Problem: Wenn du den Button der Eingabe Klasse hinzufügst übergib das erstellte Buttons Objekt und setze es als Instanzattribut des Eingabe Objekts.
 
Hallo, ich habe jetzt die Listener in eine Klasse geschrieben allerdings funktionieren sie nicht ganz. Wenn ich auf die Buttons drücke Multipliziert sich die zahl und steigt exponentiel.
Java:
    public class Listener1 implements ActionListener {

         @Override
          public void actionPerformed(ActionEvent e) {
             JComponent source = (JComponent)(e.getSource());
              String cmd = e.getActionCommand();
              System.out.println(cmd);
         
             
              if (source == (JComponent)player1_1()){
                if(cmd.equals("+1")) { 
                      result += 1.0;
                      l1_1.setFont(bold);
                      l1_1.setText(String.valueOf(result));
                      System.out.println("temp - result" + result);
                      if (result >= 8) {
                        player1_1().setBackground(Color.RED);
                      }
                      if (result == 10) {
                        player1_1().setVisible(false);
                      }
                  }
              }
              if (source == (JComponent)player1_2()){
                if(cmd.equals("+1")) {
                      result2 += 1.0;
                      l1_2.setFont(bold);
                      l1_2.setText(String.valueOf(result2));
                      System.out.println("temp - result2" + result2);
                      if (result2 >= 8) {
                        player1_2().setBackground(Color.RED);
                      }
                      if (result2 == 10) {
                        player1_2().setVisible(false);
                      }
                  }
              }
              if (source == (JComponent)player1_3()){
                if(cmd.equals("+1")) { //mit equals und nicht ==
                      result3 += 1.0;
                      l1_3.setFont(bold);
                      l1_3.setText(String.valueOf(result3));
                      System.out.println("temp - result3" + result3);
                      if (result3 >= 8) {
                        player1_3().setBackground(Color.RED);
                      }
                      if (result3 == 10) {
                        player1_3().setVisible(false);
                      }
                  }
              }
              if (source == (JComponent)player2_1()){
                if(cmd.equals("+1")) { //mit equals und nicht ==
                      result4 += 1.0;
                      l2_1.setFont(bold);
                      l2_1.setText(String.valueOf(result4));
                      System.out.println("temp - result4" + result4);
                      if (result4 >= 8) {
                        player2_1().setBackground(Color.RED);
                      }
                      if (result4 == 10) {
                        player2_1().setVisible(false);
                      }
                  }
              }
              if (source == (JComponent)player2_2()){
                if(cmd.equals("+1")) {
                      result5 += 1.0;
                      l2_2.setFont(bold);
                      l2_2.setText(String.valueOf(result5));
                      System.out.println("temp - result5" + result5);
                      if (result5 >= 8) {
                        player2_2().setBackground(Color.RED);
                      }
                      if (result5 == 10) {
                        player2_2().setVisible(false);
                      }
                  }
              }
              if (source == (JComponent)player2_3()){
                if(cmd.equals("+1")) {
                      result6 += 1.0;
                      l2_3.setFont(bold);
                      l2_3.setText(String.valueOf(result6));
                      System.out.println("temp - result6" + result6);
                      if (result6 >= 8) {
                        player2_3().setBackground(Color.RED);
                      }
                      if (result6 == 10) {
                        player2_3().setVisible(false);
                      }
                  }
              }
 
Aus deinem Code snippet ist überhaupt nicht ersichtlich, wo das von dir beschriebene Verhalten herkommen könnte.
Kleiner Anfängertipp: wenn man anfängt, Code per copy-paste zu duplizieren, und an den Kopien nur kleinere Änderungen macht, ist was am Design falsch. Dann ist es sehr nützlich, sich aufzuschreiben, welche Funktionalität man braucht, woraus sich dann ergibt, wie eine entsprechende Methode oder Object aufgebaut sein muss.
Du brauchst offensichtlich ein Object mit folgenden Fähigkeiten:
- Verwaltung eines double-Wertes
- Zugriff auf einen JButton und eine JLabel
- Ändern des double-Wertes und ggf. der Eigenschaften von JButton und JLabel, wenn der JButton geklickt wird, d. h. das Object muss ein ActionListener sein.
So könnte das ungefähr aussehen:
Java:
public class Listener implements ActionListener {

    private JButton button;
    private JLabel label;
    double result = 0.0;

    public Listener(JButton button, JLabel label) {
        this.button = button;
        this.label = label;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        String cmd = e.getActionCommand();
        System.out.println(cmd);

        if (source == button) {
            if (cmd.equals("+1")) {//wahrscheinlich überflüssig
                result += 1.0;
                label.setFont(label.getFont().deriveFont(Font.BOLD));
                label.setText(String.valueOf(result));
                System.out.println("temp - result" + result);
                if (result >= 8) {
                    button.setBackground(Color.RED);
                }
                if (result == 10) {
                    button.setVisible(false);
                }
            }
        }
    }
}
 
Okay das Problem mit den steigernden Zahlen hab ich behoben, jedoch hänge ich jetzt daran das ich den Listener nicht benutzen kann, das was im Label steht wird einfach nicht verändert und das Label bleibt leer. Dies ist mein Code.
Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class ListenerSrc implements ActionListener {
  
    ButtonsPanel bp = new ButtonsPanel();
    LabelsPanel lp = new LabelsPanel();

    private JButton button;
    private Label label;
    double result = 0.0;

    public ListenerSrc(JButton button, Label label) {
        this.button = bp.getPlayer1Button1;
        this.label = lp.getLabel1Player1;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        String cmd = e.getActionCommand();
        System.out.println(cmd);
      
        if (source == button) {
                result += 1.0;
                label.setFont(label.getFont().deriveFont(Font.BOLD));
                label.setText(String.valueOf(result));
                System.out.println("temp - result" + result);
                if (result >= 8) {
                    button.setBackground(Color.RED);
                }
                if (result == 10) {
                    button.setVisible(false);
              
            }
        }
    }
}
 
Hier greife ich auf den Listener zu. Jedoch bis jetzt nur beim getPlayer1Button1;
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class ButtonsPanel {
  
    JButton getPlayer1Button1 = new JButton("+1");
    JButton getPlayer1Button2 = new JButton("+1");
    JButton getPlayer1Button3 = new JButton("+1");
    JButton getPlayer2Button1 = new JButton("+1");
    JButton getPlayer2Button2 = new JButton("+1");
    JButton getPlayer2Button3 = new JButton("+1");
  
    //ButtonListener ButtonsListener = new ButtonListener();
  
    Font bold = new Font("Helvetica", Font.BOLD, 19);
  
    public Component ButtonsPanelPlayer1() {
      
        LabelsPanel lp = new LabelsPanel();
        ListenerSrc ls = new ListenerSrc(getPlayer1Button1, lp.getLabel1Player1);
      
        JPanel ButtonsPanelPlayer1 = new JPanel();
      
        ButtonsPanelPlayer1.setLayout(null);
      
        ButtonsPanelPlayer1.setBounds(100, 200, 70, 150);
        ButtonsPanelPlayer1.setBackground(Color.gray);
      
        getPlayer1Button1.setBounds(10, 0, 50, 20);
        getPlayer1Button1.addActionListener(ls);
        ButtonsPanelPlayer1.add(getPlayer1Button1);
      
        getPlayer1Button2.setBounds(10, 50, 50, 20);
        ButtonsPanelPlayer1.add(getPlayer1Button2);
      
        getPlayer1Button3.setBounds(10, 100, 50, 20);
        ButtonsPanelPlayer1.add(getPlayer1Button3);
      
        return ButtonsPanelPlayer1;
    }
  
    public Component ButtonsPanelPlayer2() {
      
        JPanel ButtonsPanelPlayer2 = new JPanel();
      
        ButtonsPanelPlayer2.setLayout(null);
      
        ButtonsPanelPlayer2.setBounds(820, 200, 70, 150);
        ButtonsPanelPlayer2.setBackground(Color.gray);
      
        getPlayer2Button1.setBounds(10, 0, 50, 20);
        ButtonsPanelPlayer2.add(getPlayer2Button1);
      
        getPlayer2Button2.setBounds(10, 50, 50, 20);
        ButtonsPanelPlayer2.add(getPlayer2Button2);
      
        getPlayer2Button3.setBounds(10, 100, 50, 20);
        ButtonsPanelPlayer2.add(getPlayer2Button3);
      
        return ButtonsPanelPlayer2;
    }
    /*
    double result;
  
    public class ButtonListener implements ActionListener {
      
      
      
        LabelsPanel lp = new LabelsPanel();

         @Override
          public void actionPerformed(ActionEvent e) {
            
              String cmd = e.getActionCommand();
              System.out.println(cmd);
            
              if(cmd.equals("+1")) {
                    result += 1.0;
                    //l1_2.setFont(bold);
                    //l1_2.setText(String.valueOf(result));
                    System.out.println("temp2 - result2" + result);
                }
              }
         }*/
    }
Den unteren Listener habe ich extra Zitiert, da ich diesen nicht mehr brauche/benutzen will.
 
Bitte tue uns und dir einen Gefallen und kaufe dir ein Einsteiger Buch und arbeite dieses durch. Solange du keine Ahnung hast was objektorientiertes programmieren bedeutet und wie man mit Klassen und Objekten umgeht und welche scopes diese haben macht es keinen Sinn irgendwelche Programme zu schreiben die eine UI haben, geschweige denn mit interfaces und listener zu arbeiten
 
Ähnlicher Fehler wie oben:
Du übergibst dem Konstruktor von ListenerSrc einen JButton und ein Label (btw: bitte keine AWT Klasen mehr verwenden! Nutze statt Label bitte JLabel). Mit den übergebenenen Objekten machst du aber gar nix, sondern weist den Instanzvariablen Objekte zu, die aus dem "internen" ButtonsPanel und dem LabelsPanel der ListenerSrc-Klasse kommen. Diese "internen" Objekte werden allerdings nie eine Gui hinzugefügt.
Bitte nutze die Listener-Klasse so wie beschrieben, und mache da keine Änderungen dran, die du nicht verstehst.
 

Neue Themen


Zurück
Oben