FabianB Geschrieben June 8, 2012 at 13:37 Geschrieben June 8, 2012 at 13:37 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. Zitieren
Nic Geschrieben June 8, 2012 at 14:30 Geschrieben June 8, 2012 at 14:30 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. Zitieren
thunderbird Geschrieben June 8, 2012 at 14:42 Geschrieben June 8, 2012 at 14:42 Ich hatte da schonmal ein ähnlichen Problem :-) Das hier sollte dir helfen. http://www.tinkerunity.org/forum/index.php/topic,169.msg584.html#msg584 Zitieren
Nic Geschrieben June 8, 2012 at 14:46 Geschrieben June 8, 2012 at 14:46 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) Zitieren
FabianB Geschrieben June 8, 2012 at 15:58 Autor Geschrieben June 8, 2012 at 15:58 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 Zitieren
borg Geschrieben June 8, 2012 at 16:03 Geschrieben June 8, 2012 at 16:03 @FabianB: Eigentlich sollte das in der Tat gehen. Welche Version haben denn deine Java Bindings? Zitieren
FabianB Geschrieben June 8, 2012 at 16:08 Autor Geschrieben June 8, 2012 at 16:08 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. Zitieren
Nic Geschrieben June 8, 2012 at 16:11 Geschrieben June 8, 2012 at 16:11 Zeig uns mal den kompletten Code, insbesondere den Teil der lcd deklariert. Zitieren
FabianB Geschrieben June 8, 2012 at 16:13 Autor Geschrieben June 8, 2012 at 16:13 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 Zitieren
Nic Geschrieben June 8, 2012 at 16:29 Geschrieben June 8, 2012 at 16:29 Schreib mal final vor BrickletLCD20x4 lcd. Zitieren
FabianB Geschrieben June 8, 2012 at 17:57 Autor Geschrieben June 8, 2012 at 17:57 Klappt, vielen Dank. Fragt mich jetzt nicht, wieso ich trotz dieser Fehlermeldung nicht auf die Idee gekommen bin... Peinlich Zitieren
Satireforhigher Geschrieben December 23, 2012 at 17:52 Geschrieben December 23, 2012 at 17:52 Nachträglich vielen Dank für den Thread, hat mir gerade sehr weitergeholfen. Vielleicht kann man ja die Deklaration als "final" in die downloadbaren Beispiele einbringen, denke auf dieses Probleme stosst man als Erstes, sobald man mit den Beispielen rumspielt. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.