Frage von zonto, 49

Was ist an diesen Code falsch (ChangeListener)?

Hallo, Ich versuche gerade einen ChangeListener umzusetzen und bekomme dabei die folgende Fehlermeldung:"Some massages have been simplified, recompile with -xdiags: verbose to get full output". Dabei wird mein "ChangeEvent" gemarkt.Zu beachten ist, dass ich dies in Java BlueJ programmiere mit der hilfsklasse "Zeichenfenster" die mir eben sachen zeichnet. Hier ist der code:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Spiel implements ActionListener
{
private boolean rechtsAn;
private Gravity gravity;
JButton rechts = new JButton("rechts");

Timer test = new Timer(1,new ActionListener() {
    public void actionPerformed(ActionEvent ev)
    {
        if(rechtsAn = true)
        {
            gravity.x++;
        }
    }
});

public Spiel()
{
   rechtsAn = false;
   gravity = new Gravity();
   rechts.addChangeListener(this);
   Zeichenfenster.gibFenster().komponenteHinzufuegen(rechts,"unten");
}

public void stateChanged(ChangeEvent e)
{
    if(e.getSource()==this.rechts)
    {
        if(rechtsAn = false){
            rechtsAn = true;
        } else {
            rechtsAn = false;
        }
    }
 }
}

Hierbei möchte ich bewirken, dass wenn man den JButton drückt, sich x solange erhöht bis man wieder loslässt.

Mfg zonto

Antwort
von MalNachgedacht, 24

Zumindest die beiden Zeilen machen keinen Sinn

 if(rechtsAn = true){
 if(rechtsAn = false)

Beides sind nämlich keine Vergleiche sondern Zuweisungen. Zum Vergleichen muss man 

==

 benutzen.

Die erste Zuweisung hat als Wert immer true und damit ist die if-Bedingung immer erfüllt - bei der zweiten ist es umgekehrt: Wert ist immer false, if-Bedingung nie erfüllt

Kommentar von KnusperPudding ,

Du hast recht, die Zeilen machen keinen Sinn. Aber sind nicht zwangsläufig ein Fehler.

= Ist eine Wertzuweisung aber ist im aktuellen Kontext durchaus zulässig, da boolean werte verwendet werden.

Folgedessen wird ihm dieses Missgeschick erst auffallen, wenn er den Code aufgrund anderer Fehler behoben hat. Und zumindest keine Fehler beim kompilieren bringt.

Kommentar von zonto ,

Oh ja, der alte Fehler :D Danke schonmal ^^

Habe ihn nun ausgebessert, doch mein Problem besteht weiterhin, mit der selben Fehlermeldung

Expertenantwort
von KnusperPudding, Community-Experte für Java, 28

Um dein Code auszuführen fehlen mir die Klassen:

Gravity und Zeichenfenster.

Daher kann ich dir bis zu dem Zeitpunkt nur soviel sagen:

In deiner Klasse Spiel sagst du, du würdest einen ActionListener implementieren

public class Spiel implements ActionListener {

Allerdings fehlt in dieser Klasse die implementierung der Methode:

public void actionPerformed(ActionEvent e);

Bei dieser Stelle: 

rechts.addChangeListener(this);

Schließe ich daraus, dass du ausversehen Actionlistener implementierst, aber einen Changelistener implementieren wolltest, da du die Methode bereits in deiner Klasse hast:

public void stateChanged(ChangeEvent e);

Entsprechend einfach die Implementierung ändern.

Kommentar von zonto ,

Da hast du recht, ich wollte zuerst einen ActionListener implementieren, hab mich jedoch umentschieden. Habe es nun ausgebessert und statt "implements ActionListener" "implements ChangeListener" geschrieben. Jedoch kommt nun die selbe Fehlermeldung, nur dass BlueJ nun das "implements ChangeListener" markiert. Hoffe auf eine weiter Antwort.

Mfg Zonto

Kommentar von KnusperPudding ,

Schau mal bei deinen Imports, ich bin mir relativ sicher, du hast den falschen Changelistener erwischt.

Ich nehme an den hast du erwischt:

javafx.beans.value.ChangeListener;

Nachdem du eine Swing-Applikation hast, sollte sicherlich dieser hier gemeint sein:

javax.swing.event.ChangeListener;

Einfach austauschen.

Kommentar von zonto ,

Habe nun noch das genaue ChangeEvent und den ChangeListener importiert, nun kommt keine Fehlermeldung mehr, jedoch bringt mir die ganze sache irgendwie nicht den gewünschten effekt.

Nochmals Vielen Dank für die Hilfe

Mfg Zonto

Kommentar von KnusperPudding ,

sie anderer Kommentar, Auch wenn der Import fehlte, ist der verweis auf den falschen Changelistener das eigentliche Problem.

Antwort
von phigeek, 4

Ich denke, die eigentliche Frage wurde bereits beantwortet.

Schreibe jedoch nie "xyz == true", da gibt es den doofen Java-Fehler "xyz = true". Dies wird als Zuweisung betrachtet. Da eine Zuweisung (dummerweise) in Java auch ein Ausdruck ist, fällst Du hier in eine Falle:

http://www.santis-training.ch/training/java/pitfalls.php#java

Schreibe besser

if(rechtsAn)

bzw.

if(! rechtsAn)

Keine passende Antwort gefunden?

Fragen Sie die Community