Jump to content

Recommended Posts

Geschrieben

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)


Geschrieben

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.

 

Geschrieben

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();

Geschrieben

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?

Geschrieben

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

 

 

Geschrieben

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.

Geschrieben

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 :D

  • 2 weeks 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...