Im ActionListener eine "äußere" Variable verändern

Gmork

Mitglied
Guten Abend,
ich habe eine Klasse mit einem ActionListener. Dessen Methode actionPerformed soll einen Boolean der äußeren Klasse auf true setzen. Wie ist das möglich bzw ist das möglich?
(Ich möchte eher ungern eine Textausgabe dafür nutzen.)

Hoffe mir kann jemand helfen,
MfG Gmork
 
In deiner Klasse mit dem boolschen Wert, erstellst du einen Setter für für die Variable. Deinem ActionListener übergibst du im Konstruktor die Klasse, mit dem boolschen Wert.
Über die Instanze dieser Klasse kannst du dann den Setter aufrufen

Java:
public class bla{

private boolean isGameRunning;

public static void main(String args[])
{
btn.addActionListener(new MyActionListener(this);
}

public void setIsGameRunning(boolean isGameRunning){this.isGameRunning =     isGameRunning;}

}
-----
public clsss MyActionListener implements ActionListener{
private Bla bla;

public MyActionListener(Bla bla)
{
    this.bla = bla;
}

private void actionPerferomed(ActionEvent e)
{
     ...
     bla.setIsGameRunning(false);
}

[/code

Gruß
Robert
 
Habe den Code von Robat ein wenig aufgeräumt:
Java:
public class Game {
    private boolean isRunning;
    //...

    public static void main(String args[]) {
        pauseButton.addActionListener(new PauseActionListener(this);
    }

    public void setIsRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }
}
Java:
public class PauseActionListener implements ActionListener {
    private final Game game;

    public PauseActionListener(final Game game) {
        this.game = game;
    }

    private void actionPerferomed(ActionEvent e) {
        game.setIsRunning(false);
    }
}
 
Danke euch beiden!
Genau nach so einer Lösung habe ich gesucht. 😀

[Edit]
Funktioniert leider nicht wirklich. :/ Jedenfalls nicht bei meinem aktuellen Beispiel dazu:
Java:
public class Window {

   private JFrame frame;
   private JButton btn;
   private boolean bool = false;

   public static void main(String[] args) {
     new Window();
   }

   public Window() {
     frame = new JFrame();
     frame.setBounds(100, 100, 450, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     btn = new JButton("Button");
     frame.getContentPane().add(btn, BorderLayout.CENTER);
     btn.addActionListener(new BooleanActionListener(this));
     frame.setVisible(true);
    
     while(true) {
       if(bool) btn.setText("Geklickt");
     }
   }

   public void setBoolean(boolean bool) {
     this.bool = bool;
   }
}
Java:
public class BooleanActionListener implements ActionListener {
   private final Window window;

   public BooleanActionListener(final Window window) {
     this.window = window;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
     window.setBoolean(true);
   }
}
Ich sehe allerdings auch keinen Unterschied zur vorgeschlagenen Lösung?
 
Zuletzt bearbeitet:
Kann leider nicht mehr editieren, aber um es noch hinzuzufügen:
Prinzipiell klappt der Code. Er scheint aber nicht das Problem zu lösen, da man
weiterhin eine Textausgabe mit dem Boolean braucht, damit er im
folgenden korrekt ausgelesen werden kann.
 
Aktuell klappt das kleine Programm nicht.
Was passieren sollte: Klickt man auf den Button, so wird auf diesem der Text "Geklickt" angezeigt.
(Ich weiß, dass ich diesen auch direkt auf den Button schreiben kann, aber es geht mir hier um das Weiterverarbeiten der "Klick"-Information in einer anderen Klasse. Das ist lediglich ein vereinfachtes Beispiel dafür.)
Ich bin mir nicht sicher wieso, aber, wenn ich vor diese Zeile:
Java:
if(bool) btn.setText("Geklickt");
folgende Zeile schreibe:
Java:
System.out.println(bool);
, so klappt das Programm. Ohne diese Zeile klappt es eben nicht.

Anscheinend wird dadurch irgendetwas aktualisiert? Jedenfalls würde ich diese Konsolenausgabe lieber weglassen, wenn das irgendwie möglich ist.
(Wenn ich die Konsolenausgabe nutze, so könnte ich sogar den Window-Parameter weglassen und stattdessen nur
Java:
setBoolean(true);
in der Methode actionPerformed schreiben. Auch da bin ich mir nicht sicher, wieso das geht bzw teilweise geht. (Teilwese deswegen, da man hier natürlich ebenfalls die Konsolenausgabe benötigt.))
 
Zuletzt bearbeitet:
Du willst doch, dass der Text geändert wird wenn man auf den Button drückt, also muss dein:

Java:
btn.setText("...");

auch in deine actionPerformed Methode
 
Also erstmal ein while(true) macht man nicht. 😛
Das was du willst kann man auf unterschiedliche weise lösen.
Der Ansatz von @Robat sollte so funktionieren:
Java:
public class Window {
   private JFrame frame;
   private JButton btn;
   private boolean bool = false;

   public static void main(String[] args) {
     new Window();
   }

   public Window() {
     frame = new JFrame();
     frame.setBounds(100, 100, 450, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     btn = new JButton("Button");
     frame.getContentPane().add(btn, BorderLayout.CENTER);
     btn.addActionListener(new BooleanActionListener(this));
     frame.setVisible(true);
   }

   public void setGeklicktAsButtonText() {
     btn.setText("Geklickt");
   }
}
Java:
public class BooleanActionListener implements ActionListener {
   private final Window window;

   public BooleanActionListener(final Window window) {
     this.window = window;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
     window.setGeklicktAsButtonText();
   }
}

Ein andere Ansatz wäre den Button an den Listener zu übergeben:
Java:
public class Window {
   private JFrame frame;
   private JButton btn;
   private boolean bool = false;

   public static void main(String[] args) {
     new Window();
   }

   public Window() {
     frame = new JFrame();
     frame.setBounds(100, 100, 450, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     btn = new JButton("Button");
     frame.getContentPane().add(btn, BorderLayout.CENTER);
     btn.addActionListener(new BooleanActionListener(btn));
     frame.setVisible(true);
   }
}
Java:
public class BooleanActionListener implements ActionListener {
   private final JButton button;

   public BooleanActionListener(final JButton button) {
     this.button = button;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
     button.setText("Geklickt");
   }
}
 
Ein andere Ansatz wäre den Button an den Listener zu übergeben:

Kannst du dir nicht den Button auch über

Java:
public class BooleanActionListener implements ActionListener {
   @Override
   publicvoid actionPerformed(ActionEvent e){
      JButton btn = (JButton) e.getSource();
      btn.setText("Geklickt");
   }
}

holen? In dem Beispiel geht man natürlich davon aus, dass es nur einen Button gibt.
Das kann man natürlich auch mit einer if-else / switch-case abfangen, wenn man das will.

Weiß nicht, welcher Weg in dem Moment am sinnigsten wäre
 

Zurück
Oben