urmel007 Posted July 29, 2014 at 06:40 PM Share Posted July 29, 2014 at 06:40 PM Hallo, wie einige Forumsteilnehmer vor mir habe ich auch Probleme mit Listenern. Leider habe ich nicht die richtige Lösung im Forum gefunden. Hier das Problem: Für die Erfassung der Tasten am Bricklet LCD20x4 habe ich wie in den Beispielen den ButtonPressedListener und ButtonReleasedListener hinzugefügt. Um auch mehrere Tastendrücke zugleich erfassen zu können (soll für SET oder RESET Anweisungen genutzt werden) addiere ich über eine Variabale außerhalb der Listener die Tastensignale bei Pressed auf und ziehe diese bei Released wieder ab. Genau das ist das Problem: ich kann nicht mit Variabalen außerhalb der Klassen kommunizieren. Wie könnte so etwas gehen? Ich bin für jeden Hinweis dankbar. Grüße Urmel Hier der Code package net.tinkerforgeTest; import com.tinkerforge.BrickletDualRelay; import com.tinkerforge.BrickletHumidity; import com.tinkerforge.BrickletLCD20x4; import com.tinkerforge.IPConnection; public class ExampleSimple { private static final String HOST = "localhost"; private static final int PORT = 4223; private static final String UIDDualRelay = "kuE"; // Change to your UID private static final String UIDHumidity = "nED"; // Change to your UID private static final String UIDDisplay = "ocE"; // Change to your UID // Note: To make the example code cleaner we do not handle exceptions. Exceptions you // might normally want to catch are described in the documentation public static void main(String args[]) throws Exception { final short buttonState = 0; // der Tastenstatus außerhalb der Listener IPConnection ipcon = new IPConnection(); // Create IP connection BrickletDualRelay dr = new BrickletDualRelay(UIDDualRelay, ipcon); // Create device object BrickletHumidity hum = new BrickletHumidity(UIDHumidity, ipcon); // Create device object final BrickletLCD20x4 lcd = new BrickletLCD20x4(UIDDisplay, ipcon); // Create device object ipcon.connect(HOST, PORT); // Connect to brickd // Don't use device before ipcon is connected // Turn backlight on lcd.backlightOn(); // Write "Hello World" lcd.writeLine((short)0, (short)0, "Hello World"); // Turn relays alternating on/off for 10 times with 1 second delay for(int i = 0; i < 6; i++) { Thread.sleep(200); if(i % 2 == 1) { dr.setState(true, false); } else { dr.setState(false, true); } } // Get current humidity (unit is %RH/10) for(int j = 0; j < 2; j++){ Thread.sleep(1000); int humidity = hum.getHumidity(); // Can throw com.tinkerforge.TimeoutException System.out.println("Relative Humidity: " + humidity/10.0 + " %RH"); lcd.clearDisplay(); lcd.writeLine((short)0, (short)0, "RH: " + humidity/10.0 + " %RH"); } // Add and implement listener for pressed and released events lcd.addButtonPressedListener(new BrickletLCD20x4.ButtonPressedListener() { public void buttonPressed(short button) { // von hier kein Zugriff auf buttonState System.out.println("Pressed: " + button); switch(button){ case 0: buttonState = buttonState + 1; // kein Zugriff break; case 1: buttonState = buttonState + 2; break; case 2: buttonState = buttonState + 4; break; case 3: buttonState = buttonState + 8; break; } } }); lcd.addButtonReleasedListener(new BrickletLCD20x4.ButtonReleasedListener() { public void buttonReleased(short button) { // von hier kein Zugriff auf buttonState System.out.println("Pressed: " + button); switch(button){ case 0: buttonState = buttonState - 1; break; case 1: buttonState = buttonState - 2; break; case 2: buttonState = buttonState - 4; break; case 3: buttonState = buttonState - 8; break; } } }); lcd.backlightOff(); ipcon.disconnect(); System.out.println("Ende"); } } Quote Link to comment Share on other sites More sharing options...
Equinox Posted July 29, 2014 at 07:31 PM Share Posted July 29, 2014 at 07:31 PM Hallo, versuch mal die Variable als Klassenvariable anzulegen, d.h. zwischen public class ExampleSimple { private static final String HOST = "localhost"; private static final int PORT = 4223; private static final String UIDDualRelay = "kuE"; // Change to your UID private static final String UIDHumidity = "nED"; // Change to your UID private static final String UIDDisplay = "ocE"; // Change to your UID und public static void main(String args[]) throws Exception { also da, wo du auch die Konstanten definierst. Quote Link to comment Share on other sites More sharing options...
Equinox Posted July 29, 2014 at 07:33 PM Share Posted July 29, 2014 at 07:33 PM ahhh, und "final" sollte sie auch nicht sein. Quote Link to comment Share on other sites More sharing options...
urmel007 Posted July 30, 2014 at 04:46 PM Author Share Posted July 30, 2014 at 04:46 PM Hallo Equinox, habe es versucht als Klassenvariable anzulegen, aber auch hier ist kein Zugriff möglich. Ich habe es mit buttonState = 1 oder me.buttonState = 1 probiert.Beides geht nicht. Gibt es einen alternativen Weg die Listener zu verknüpfen? Grüße Urmel Quote Link to comment Share on other sites More sharing options...
Equinox Posted July 30, 2014 at 05:42 PM Share Posted July 30, 2014 at 05:42 PM Hallo, hast du auch das "final" entfernt? Ich mache das auch und es geht problemlos. Beispiel: IPConnection direkt nach der Klassendefinition private IPConnection ipcon = null; und dann in einer Methode (die bei mir init() heißt): ipcon.addConnectedListener(new IPConnection.ConnectedListener() { @Override public void connected(short disconnectReason) { try { System.out.println("Connected CB called."); ipcon.enumerate(); } catch (NotConnectedException exc) { // Should never happen System.out.println("Connected called but not connected."); System.out.println(exc.getMessage()); } } }); Ich rufe in meinen Listenern auch Methoden der umgebenden Klasse auf. Quote Link to comment Share on other sites More sharing options...
urmel007 Posted July 30, 2014 at 08:36 PM Author Share Posted July 30, 2014 at 08:36 PM Hallo, ich bin z.Z. unterwegs und kann erst am Wochenende den Code bzgl. dem final Statement prüfen. Ich melde mich dann umgehend. Grüße Urmel Quote Link to comment Share on other sites More sharing options...
urmel007 Posted August 1, 2014 at 06:27 PM Author Share Posted August 1, 2014 at 06:27 PM Hallo Equinox, der Tip die Variable als Klassenvariable zu deklarieren und das final zu entfernen war goldrichtig. --> Es Funktioniert. Grüße & Vielen Dank Urmel PS wann kommt der RED Brick ? public class ExampleSimple { private static final String HOST = "localhost"; private static final int PORT = 4223; private static final String UIDDualRelay = "kuE"; // Change to your UID private static final String UIDHumidity = "nED"; // Change to your UID private static final String UIDDisplay = "ocE"; // Change to your UID private static int buttonState = 0; // Note: To make the example code cleaner we do not handle exceptions. Exceptions you // might normally want to catch are described in the documentation public static void main(String args[]) throws Exception { IPConnection ipcon = new IPConnection(); // Create IP connection BrickletDualRelay dr = new BrickletDualRelay(UIDDualRelay, ipcon); // Create device object BrickletHumidity hum = new BrickletHumidity(UIDHumidity, ipcon); // Create device object BrickletLCD20x4 lcd = new BrickletLCD20x4(UIDDisplay, ipcon); // Create device object ... ... ... Quote Link to comment Share on other sites More sharing options...
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.