treaki Geschrieben May 27, 2012 at 18:26 Geschrieben May 27, 2012 at 18:26 hi, ich bin noch relativ neu in java und versuche ein grafisches (swing) tinkerforge programm zu schreiben. oben im fenster befinden sich 2 Felder für host und port und ein button der je nach status connect oder disconnect anzeigt. mein problem ist allerdings dass ich es nicht hinkriege eine globale ipconnection aufzubauen die in der ganzen klasse läuft. kann mir da jemand helfen?? codschnipsel: final JButton btnConnect = new JButton("connect"); btnConnect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("connect/disconnect button pressed"); System.out.println("connection="+connection); IPConnection ipcon = null; if(connection==false){ System.out.println("start connecting"); btnConnect.setText("connecting..."); host=txthostename.getText(); port=Integer.parseInt( txtport.getText()); // Note: To make the example code cleaner we do not handle exceptions. Exceptions you // might normally want to catch are described in the comments below // Create connection to brickd try{ ipcon = new IPConnection(host, port); // Can throw IOException //System.out.println("Press ctrl+c to exit"); lblDisconnected.setText("Connected"); btnConnect.setText("disconnect"); connection=true; }catch (IOException e1){ lblDisconnected.setText("connection failed, Disconnected"); btnConnect.setText("connect"); connection=false; } // Register enumerate listener and print incoming information ipcon.enumerate(new IPConnection.EnumerateListener() { public void enumerate(String uid, String name, short stackID, boolean isNew) { if(isNew) { System.out.println("New device:"); if(name.startsWith("Distance IR Bricklet")){ } } else { System.out.println("Removed device:"); } System.out.println(" Name: " + name); System.out.println(" UID: " + uid); System.out.println(" Stack ID: " + stackID); } }); //ipcon.joinThread(); System.out.println("ending connecting"); } else{ System.out.println("starting disconnecting"); ipcon.destroy(); lblDisconnected.setText("Disconnected"); btnConnect.setText("connect"); connection=false; System.out.println("ending disconnecting"); } System.out.println("connection="+connection); System.out.println("end of connect/disconnect button handler"); } }); ausgabe dess programms: connect/disconnect button pressed connection=false start connecting ending connecting connection=true end of connect/disconnect button handler New device: Name: Master Brick 1.0 UID: xxx Stack ID: 1 New device: Name: Distance IR Bricklet 1.0 UID: xxx Stack ID: 2 connect/disconnect button pressed connection=true starting disconnecting Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at main.Main$2.actionPerformed(Main.java:178) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) at java.awt.Component.processMouseEvent(Component.java:6136) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:5901) at java.awt.Container.processEvent(Container.java:2105) at java.awt.Component.dispatchEventImpl(Component.java:4497) at java.awt.Container.dispatchEventImpl(Container.java:2163) at java.awt.Component.dispatchEvent(Component.java:4323) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055) at java.awt.Container.dispatchEventImpl(Container.java:2149) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4323) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) at java.awt.EventQueue.access$000(EventQueue.java:96) at java.awt.EventQueue$1.run(EventQueue.java:608) at java.awt.EventQueue$1.run(EventQueue.java:606) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) at java.awt.EventQueue$2.run(EventQueue.java:622) at java.awt.EventQueue$2.run(EventQueue.java:620) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) Zitieren
dove Geschrieben May 27, 2012 at 21:23 Geschrieben May 27, 2012 at 21:23 Es ist einfacher wenn du den Actionlistener implementierst, als eine InnerClass zu schreiben. das wäre: class MyClass implements ActionListener { ... } Dazu musst du die Methoden, die du jetzt in der InnerClass definiert hast, in deine Klasse kopieren. Dann machst du eine Klassenvariable deiner Klasse von Typ IPConnection und dann hast das was du willst. Zitieren
treaki Geschrieben May 28, 2012 at 11:10 Autor Geschrieben May 28, 2012 at 11:10 Actionlistener?? InnerClass?? sorry dass ich so unbedarft frage aber gibts da ein tutorial was mir als c programmierer (ohne objectorientierte kentnisse) erklärt wie das leuft?? gruß Zitieren
AuronX Geschrieben May 29, 2012 at 16:15 Geschrieben May 29, 2012 at 16:15 Folgender Code stammt von dir: ipcon.enumerate(new IPConnection.EnumerateListener() { public void enumerate(String uid, String name, short stackID, boolean isNew) { if(isNew) { System.out.println("New device:"); if(name.startsWith("Distance IR Bricklet")){ } } else { System.out.println("Removed device:"); } System.out.println(" Name: " + name); System.out.println(" UID: " + uid); System.out.println(" Stack ID: " + stackID); } }); //ipcon.joinThread(); Das ist auseinandergefummelt einmal der Code drumerhum: ipcon.enumerate(DER_TEIL_INNEN_DRIN); //ipcon.joinThread(); und eben der Teil innen drin: new IPConnection.EnumerateListener() { public void enumerate(String uid, String name, short stackID, boolean isNew) { if(isNew) { System.out.println("New device:"); if(name.startsWith("Distance IR Bricklet")){ } } else { System.out.println("Removed device:"); } System.out.println(" Name: " + name); System.out.println(" UID: " + uid); System.out.println(" Stack ID: " + stackID); } } Den Teil innen drin nennt man anonyme Klasse, weil du eine ganze Klasse definierst ohne ihr einen Namen zu geben. Wenn du ihr einen Namen geben willst, dann kannst du den inneren Code irgendwo anders hinschreiben und statt new IPConnection.EnumerateListener() schreibst du dann eben class MeineNeueKlasse implements ActionListener (oder müsste das statt ActionListener eher IPConnection.EnumerateListener sein?) Der dazu passende äußere Code wäre dann ipcon.enumerate(new MeineNeueKlasse()); //ipcon.joinThread(); Zitieren
M4ST3R Geschrieben May 29, 2012 at 19:54 Geschrieben May 29, 2012 at 19:54 Mh mal ne blöde Idee (ok ist gar nicht blöd) Aber im Wiki ist ein Singleton Pattern. Das könntest du dir programmieren und dann via Setter Methode (ist noch nicht verbaut) und einiger kleiner Modifikationen eine Verbindung aufbauen, die du jederzeit von überall wieder auslesen kannst!? Oder hab ich deine Frage falsch verstanden? Zitieren
evilpunisher Geschrieben May 29, 2012 at 21:27 Geschrieben May 29, 2012 at 21:27 Hallo, also ich würde auch das Singleton Pattern wie von M4ST3R empfohlen nutzen. Du hast dann von überall Zugriff auf die Verbindung. Z.B. kannst du das dann in deiner swing-Klasse nutzen. Das Singleton Pattern bedeutet, das nur ein Objekt von der Klasse erstellt wird. Wenn du es anforderst wird das Objekt zurück gegeben bzw. wenn es noch nicht vorhanden ist (beim ersten Aufruf) erstellt. Da es ja nur eine Verbindung gibt, eignet sich das Singleton Pattern bestens dafür. MfG Zitieren
treaki Geschrieben May 30, 2012 at 05:07 Autor Geschrieben May 30, 2012 at 05:07 hi, Singleton Pattern hört sich gut an. wo finde ich mehr Informationen?? wenn ihr das tf wiki meint find ich da nichts: http://www.tinkerunity.org/wiki/index.php?title=Special%3ASearch&profile=advanced&search=Singleton+Pattern&fulltext=Search&ns0=1&redirs=1&profile=advanced danke und gruß Zitieren
Plenz Geschrieben May 30, 2012 at 05:46 Geschrieben May 30, 2012 at 05:46 Singleton Pattern hört sich gut an. wo finde ich mehr Informationen?? http://www.google.de/search?q=Singleton+Pattern Zitieren
M4ST3R Geschrieben May 30, 2012 at 09:19 Geschrieben May 30, 2012 at 09:19 Nur weil das Wiki noch echt schlecht ist vom Aufbau.... http://www.tinkerunity.org/wiki/index.php/Java_-_Kommunikationsaufbau Zitieren
The_Real_Black Geschrieben May 30, 2012 at 17:36 Geschrieben May 30, 2012 at 17:36 Nur weil das Wiki noch echt schlecht ist vom Aufbau.... http://www.tinkerunity.org/wiki/index.php/Java_-_Kommunikationsaufbau Vom Aufbau passt es schon aber wir müssen es noch mit mehr Inhalt füllen, aber Patterns müssen wir darin nicht unbedingt beschreiben ^^ dafür ist das richtige Wiki besser. http://www.tinkerunity.org/wiki/index.php/The_Real_Blacks_Projekte_ConnectionUtil Man hätte dazusagen sollen was das Singelton Pattern ist nicht jeder hat Informatik gelernt oder gar studiert. Man könnte es auch eine statische public Variable nennen. Ich verwende das Pattern in meinen Klassen häufig, da ich viele Verwaltungsklassen nicht mehrfach benötige ein beispiel befindet sich hinter dem Link oben. Zitieren
M4ST3R Geschrieben May 30, 2012 at 17:49 Geschrieben May 30, 2012 at 17:49 Vom Aufbau passt es schon aber wir müssen es noch mit mehr Inhalt füllen, aber Patterns müssen wir darin nicht unbedingt beschreiben ^^ dafür ist das richtige Wiki besser. Naja also bei meinem Browser sieht das alles echt noch schrecklich aus. Aber da ich selbst keine Lust habe es zu verbessern, beschwere ich mich auch besser nicht Zitieren
treaki Geschrieben June 9, 2012 at 18:42 Autor Geschrieben June 9, 2012 at 18:42 vielen dank euch allen. ich habs jetzt hin bekommen. leuft super. danke euch allen für die mühe. gruß 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.