PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Von innerer Klasse auf umschliessende Klasse zugreifen



AceTheFace
06-08-2006, 11:45
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)



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

OpOs
07-08-2006, 08:53
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)

AceTheFace
07-08-2006, 09:28
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

nul
07-08-2006, 12:35
Hast du mal Versucht die Variablen als default zu deklarieren - also ohne private?

AceTheFace
07-08-2006, 12:39
Hast du mal Versucht die Variablen als default zu deklarieren - also ohne private?

Ja, brachte, wie auch public, nichts.

Gruß,
Ace

falke2203
08-08-2006, 11:43
Wenn du die vermeintlich innere Klasse (was sie nicht ist) tatsächlich als innere Klasse implementierst, funktioniert auch der Zugriff direkt auf die Variablen. :)

AceTheFace
08-08-2006, 11:50
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

falke2203
08-08-2006, 12:02
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

mwanaheri
08-08-2006, 13:56
persönlich halte ich übrigens anonyme Listener für eine Unsitte. Es kostet dich keine weiter Zeile, den Listener hier zu implementieren.