Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Von innerer Klasse auf umschliessende Klasse zugreifen

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71

    Von innerer Klasse auf umschliessende Klasse zugreifen

    Hallo,

    ich spiele gerade ein bisschen mit QTJambi rum und versuche mich an einem kleinen Jabberclient. Dafür verwende ich zusätzlich die Jabber-Bibliothek Smack (http://jivesoft.org/smack).
    In meiner Rosterklasse benötige ich einen RosterListener, der eben auf verschiedene Ereignisse reagiert. Nun will ich aber bei einem auftretenden Event nicht nur mit "System.out.println()" reagieren sondern gerne meine GUI darauf reagieren lassen. Leider kann ich aber innerhalb der inneren RosterListener-Klasse nicht auf die GUI-Elemente der umgebenden Klasse zugreifen ("Cannot refer to a non-final variable tree inside an inner class defined in a different method"). Die Variable tree "final" zu deklarieren hilft leider auch nicht weiter.
    Hier mal der code: (Problem tritt in der presenceChanged-Methode auf)

    Code:
    public class JJabRoster extends QObject
    {
    	private LinkedList<RosterGroup> groups;
    	private QTreeWidget tree;
    	private XMPPConnection con;
    	private Roster roster;
    	private boolean hideEmptyGroups;
    	private boolean hideOfflineContacts;
    	
    	public JJabRoster(XMPPConnection con, QTreeWidget tree, boolean hideEmptyGroups, boolean hideOfflineContacts)
    	{
    		this.tree = tree;
    		this.con = con;
    		this.roster = con.getRoster();
    		this.roster.addRosterListener(new RosterListener() {
    			
    			public void rosterModified(Collection addresses) 
    			{
    				System.out.println("roster modified: "+addresses.toString());
    			}
    
    			public void presenceChanged(String user) 
    			{
    				QTreeWidgetItem parent = new QTreeWidgetItem(tree);
    				parent.setText(0, user);
    				System.out.println("presenceChanged: "+user+" (" );
    			}	
    			    
    			public void entriesUpdated(Collection addresses)
    			{
    				System.out.println("entries updated: "+addresses.toString());
    			}
    			    
    			public void entriesDeleted(Collection addresses)
    			{
    			    System.out.println("entries deleted: "+addresses.toString());
    			}
    			    
    			public void entriesAdded(Collection addresses)
    			{
    				System.out.println("entries added: "+addresses.toString());
    			}
    		}); 
    }

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.10.2005
    Beiträge
    39
    definier dir in der aeusseren klasse 'ne getTree()/setTree()-Methode, und benutz die... sollte funktionieren (das wird dann auch die anderen variablen betreffen, auf die du zugreifst)
    Geändert von OpOs (07-08-2006 um 08:56 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    D'Oh! Auf die Idee bin ich gar nicht gekommen....bin davon ausgegangen, dass wenn Variablenzugriff nicht funktioniert, gehen Methodenzugriffe auch nicht...

    Na ja, funktioniert perfekt, danke!

    Gruß,
    Ace

  4. #4
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Hast du mal Versucht die Variablen als default zu deklarieren - also ohne private?
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Zitat Zitat von nul
    Hast du mal Versucht die Variablen als default zu deklarieren - also ohne private?
    Ja, brachte, wie auch public, nichts.

    Gruß,
    Ace

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    Wenn du die vermeintlich innere Klasse (was sie nicht ist) tatsächlich als innere Klasse implementierst, funktioniert auch der Zugriff direkt auf die Variablen.

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.03.2003
    Beiträge
    71
    Zitat Zitat von falke2203
    Wenn du die vermeintlich innere Klasse (was sie nicht ist) tatsächlich als innere Klasse implementierst, funktioniert auch der Zugriff direkt auf die Variablen.
    Wieso? Das ist eine anonyme innere Klasse...zumindest nach meinem Verständnis. Aber du darfst mich gerne belehren

    Gruß,
    Ace

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    Anonym - ja, innere Klasse - nein.

    Folgendes gilt für innere Klassen:
    • Innere Klassen werden im Rumpf einer Klasse definiert
    • Innere Klassen dürfen keine statischen Eigenschaften haben
    • Objekt innerer Klasse kann nur existieren, wenn Objekt äußerer Klasse existiert
    • Innere Klassen haben Zugriff auf alle Eigenschaften äußerer Klassen
    • Innere Klasse hat Referenz auf die äußere, d.h. this referenziert das aktuelle Object der inneren Klasse, Outer.this das aktuelle Objekt der äußeren Klasse

  9. #9
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    persönlich halte ich übrigens anonyme Listener für eine Unsitte. Es kostet dich keine weiter Zeile, den Listener hier zu implementieren.
    Das Ziel ist das Ziel.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •