Jump to content

[Java] Listener Problem


Recommended Posts

Hallo,

 

ich gehe offensichtlich falsch mit den Listenern in Java um. Ich habe mit denen noch nie wirklich gearbeitet und Nachschlagen und googlen hat gerade nicht so gut geholfen.

 

Ich will beim Drücken des ersten Buttons des LCDs das Backlight ausschalten. Wie geht das?

In der Doku steht das hier:

 

        
// Add and implement listener for pressed and released events 
lcd.addListener(new BrickletLCD20x4.ButtonPressedListener() { 
public void buttonPressed(short button) { 
System.out.println("Pressed: " + button); } 
});

 

Statt des System.out...... will ich da haben

lcd.backlightOff();

 

Kann mir jemand ein korrektes Beispiel geben oder die Verwendung der Listener kurz erklären? Mit der Erklärung aus "Java ist auch eine Insel" bin ich nicht weitergekommen.

 

 

Danke schonmal.

 

 

EDIT:

 

Sorry, Kern der Frage ist, wie ich im Listener auf das LCD zugreifen kann. Nicht, wie ich den gedrückten Button rausfinde oder so.

Es geht darum, wie ich aus dem Listener eine andere Funktion des Displays aufrufe.

Link zu diesem Kommentar
Share on other sites

Was soll ihm damit helfen ?

Er hat vermutl. das Problem innerhalb der buttonPressed Methode auf das lcd Object nicht zugreifen zu können.

 

@Fabian

Schau mal den SourceCode von adrianbernhard

http://www.tinkerunity.org/forum/index.php/topic,524.msg2895.html#msg2895 genauer an.

(unter der Methode temperatureReached, das dr, also ein BrickletDualRelay)

Link zu diesem Kommentar
Share on other sites

Danke schonmal für die schnellen Antworten.

 

Kann es nicht testen, aber propiere mal statt dem

System.out.println("Pressed: " + button); 

austauschen mit

if (button == 0) {
  lcd.backlightOff();
}

 

ich denke das Object lcd muss auch als private in der Klasse deklariert sein und nicht lokal innerhalb der Methode wie Du es im TF-Beispiel entnommen hast.

 

 

Das hatte ich so am Anfang. Geht aber nicht. Nic hat Recht, ich kann innerhalb der buttonPressed-Methode nicht auf das lcd zugreifen.

 

@Nic: Hab mir das mal angesehen. Aber wenn ich das richtig verstehe, klappt das bei ihm ja auch nicht. Und das, was ihm dann als Lösung angeboten wird, habe ich nicht verstanden.

 

 

Also nochmal das Kernproblem: Wie kann ich innerhalb der buttonPressed-Methode vom lcd auf das lcd selber zugreifen. Dürfte ja eigentlich kein Problem sein.... Eigentlich :-D

Link zu diesem Kommentar
Share on other sites

hatte ich heute morgen neu runtergeladen. Daran sollte es nicht liegen. Ich poste mal hier meinen Codeabschnitt:

 

        // Add and implement listener for pressed and released events
        lcd.addListener(new BrickletLCD20x4.ButtonPressedListener() {
            
            public void buttonPressed(short button) {
                System.out.println("Pressed: " + button);
                
                // Button 0 (erster Button) wird gedrueckt -> Licht an/aus schalten
                if ( button == 0 ) {
                    lcd.writeLine((short)0, (short)0, "Hello World");
                } 
                
                // Button 1 (zweiter Button) wird gedrueckt -> Aktuelle Temperatur auf LCD ausgeben
                if ( button == 1 ) {
                    //TODO
                }
                
                
            }
        });

 

Die Fehlermeldung dazu sieht so aus:

 

Einstieg_Musterloesung.java:79: local variable lcd is accessed from within inner class; needs to be declared final
                    lcd.writeLine((short)0, (short)0, "Hello World");
                    ^
1 error

 

Ich hoffe, dass ich das jetzt nicht falsch kopiert habe. Habe auf di schnelle evrsucht, auf meine Ausgangslage zu kommen.

Jedenfalls geht es so nicht.

Link zu diesem Kommentar
Share on other sites

Gerne, ist aus den Beispielen der TF-Doku übernommen:

 

 

import com.tinkerforge.BrickMaster;
import com.tinkerforge.BrickletPiezoBuzzer;
import com.tinkerforge.BrickletLCD20x4;
import com.tinkerforge.BrickletTemperature;
import com.tinkerforge.BrickletLinearPoti;

import com.tinkerforge.IPConnection;



public class Einstieg_Musterloesung {
    //Define connection parameters
    private static final String host = "localhost";
    private static final int port = 4223;
    
    //Define UIDs of the devices
    private static final String masterUID = "9TZyNmaVeqn"; // Change to your UID
    private static final String buzzerUID = "6tS"; // Change to your UID
    private static final String lcdUID = "6n9";
    private static final String tempUID = "6Kd";
    private static final String potiUID = "6Td";
    

    
    
    
    // Note: To make the example code cleaner we do not handle exceptions. Exceptions you
    //       might normally want to catch are described in the commnents below
    public static void main(String args[]) throws Exception {
        
        // Create connection to brickd
        IPConnection ipcon = new IPConnection(host, port); // Can throw IOException
        
        // Create device objects
        BrickMaster master = new BrickMaster(masterUID); // Create device object
        BrickletPiezoBuzzer buzzer = new BrickletPiezoBuzzer(buzzerUID);
        BrickletLCD20x4 lcd = new BrickletLCD20x4(lcdUID);
        BrickletTemperature temp = new BrickletTemperature(tempUID);
        BrickletLinearPoti poti = new BrickletLinearPoti(potiUID);

        // Add device to IP connection
        ipcon.addDevice(master); // Can throw IPConnection.TimeoutException
        ipcon.addDevice(buzzer);
        ipcon.addDevice(lcd);
        ipcon.addDevice(temp);
        ipcon.addDevice(poti);
        // Don't use device before it is added to a connection






        /*
         * Ab hier laeuft das eigentliche Programm
         *
         */

        
        /*
         * Gruppe A: Bei Knopfdruck aktuelle Temperatur auf LCD ausgeben und Beleuchtung über Button steuern:
         */
        
        //LCD Licht an
        lcd.backlightOn();
        
        // Add and implement listener for pressed and released events
        lcd.addListener(new BrickletLCD20x4.ButtonPressedListener() {
            
            public void test(){
                System.out.println("test");
            }
            
            public void buttonPressed(short button) {
                System.out.println("Pressed: " + button);
                
                // Button 0 (erster Button) wird gedrueckt -> Licht an/aus schalten
                if ( button == 0 ) {
                    lcd.writeLine((short)0, (short)0, "Hello World");
                } 
                
                // Button 1 (zweiter Button) wird gedrueckt -> Aktuelle Temperatur auf LCD ausgeben
                if ( button == 1 ) {
                    //TODO
                }
                
                
            }
        });
        
        
        
        
        //Temperatur bestimmen
        //TODO
        

        // Write "Hello World"
        lcd.writeLine((short)0, (short)0, "Hello World");
        
        
        

        /*
         * Gruppe B: Buzzer-Rhytmus durch Potentionmeter regeln:
         */
     
        //Poti
        int position = poti.getPosition(); // Can throw IPConnection.TimeoutException

        System.out.println("Position: " + position);
        
        //Buzzer Morsen
        buzzer.morseCode("... --- ...");
        
        //TODO
        lcd.backlightOff();
        
        /*
         * Bis hier laeuft das eigentliche Programm
         *
         */

        System.out.println("Press ctrl+c to exit");
        ipcon.joinThread();
    }
}

 

Sobald ich die fett markierte Zeile auskommentiere, läuft es auch ohne Probleme. Außerhalb des Listeners kann ich das Display normal beschrieben etc.

 

EDIT:

Wird leider nicht fett angezeigt. Ich meine diese Zeile im Listener:

 

lcd.writeLine((short)0, (short)0, "Hello World");

 

Sobald die weg ist, läufts

Link zu diesem Kommentar
Share on other sites

  • 6 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...