Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Im ActionListener eine "äußere" Variable verändern
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.)
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
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);
}
}
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.))
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");
}
}
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
Ja, das geht auch. Pädagogisch dachte ich mir, das es besser ist den Listener nur für eine Sache zu benutzten und das Casten, bzw. die SwitchCase, IfElse schiene zu ignorieren
Ja, das geht auch. Pädagogisch dachte ich mir, das es besser ist den Listener nur für eine Sache zu benutzten und das Casten, bzw. die SwitchCase, IfElse schiene zu ignorieren