while Schleife in Plugin stoppt nicht

Bitte aktiviere JavaScript!
Hallo,
ich schreibe ein Plugin für Gephi in welchem die Label von Knoten in Abhängigkeit von den Labeln der Nachbarknoten verändert werden. Dadurch soll Clustering unterstützt werden.
Sobald sich die Label nicht mehr verändern soll das Programm stoppen.
Und genau hier liegt das Problem, es stoppt nicht.
Ich benutze den ColumnObserver und die overserver.hasColumnChanged() Methode.
Der entscheidene Teil des Codes wäre wie folgt:

Java:
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();

    Column col = nodeTable.getColumn(prob);
    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }
    ColumnObserver observer = col.createColumnObserver(true);

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean changed = true;
    while(changed){
    for (Node n: nodes){
         ....
        n.setLabel(newLabel); 
    }

    if (observer.hasColumnChanged()){
        change = true;
    }else{
        change = false;
    }
Die Abfrage von changed folgt innerhalb der While Schleife und außerhalb der For Schleife. Wenn ich innerhalb der For Schleife abfrage, wird diese ja nur einmal durchlaufen.
Hat jemand eine Idee?
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
if (observer.hasColumnChanged()){
change = true;
}else{
change = false;
}
sorry hat jetzt nichts mit deinem Problem zutun ( glaube ich ) aber sowas ist echt pervers..
Java:
 observer.hasColumnChanged()
gibt ja einen boolean zurück oder?
Java:
 change = observer.hasColumnChanged();
ich würde mal den debugger zurate ziehen oder sysout´s auf der konsole ausgeben um zu schauen wann false eintritt und warum.
 
Dann ist doch klar, dass es immer true ergibt, wenn es irgendwann mal eine Änderung gab...

Ich würde den Observer in der while-Schleife erstellen, dann dürfte der nur bei Änderungen innerhalb eines durchlaufs Aktualität werden.
Und zusätzliche eine do-while ;)
 
Stoppt leider nach wie vor nicht. Habe den Code wie folgt abgegeändert:
Code:
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();

    Column col = nodeTable.getColumn(prob);
    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }  

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean changed = true;
    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
             ....
            n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
    }while(changed);
Hab ich noch irgendwas vergessen?
 
Vor der while wird changed deklariert und im while dann als Bedingung genutzt.


Wie funktioniert denn überhaupt der ColumnObserver?
 
Zeig doch noch mal deinen aktuellen, kompilierenden Code ;)


Wenn der keine Fehler enthält, funktioniert der Observer offensichtlich anders als gedacht.
 
Würde gerne den kompletten Code zeigen, geht aber nicht weil....... Du versteht evtl. auch so.
Vielleicht sollte ich nach einem anderen Weg zum Abbruch suchen? Vielleicht hast Du einen Vorschlag
 
Zumindest der Ausschnitt von grade in richtig wäre schön und ging ja grad auch...
Wie schon gesagt, gibt es da sowohl change als auch changed und Klammern fehlen - all das wären mögliche Fehlerquellen
 
Code:
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();
    Column col = nodeTable.getColumn(prob);

    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean change = true;

    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
        ....
        n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
    }while(change);

Vielen Dank das Du dir soviel Zeit nimmst. Habe mich bemüht den Code jetzt besser darzustellen. Leider finde ich hier keine Vorschau um den Code nochmal zu überprüfen.
 
Vielen Dank das Du dir soviel Zeit nimmst. Habe mich bemüht den Code jetzt besser darzustellen. Leider finde ich hier keine Vorschau um den Code nochmal zu überprüfen.
Unter weitere Einstellungen gibts ne Vorschau.

Warum kopierst du den Code nicht einfach? Beim abtippen schleichen sich zu viele Fehler ein, da sind ja immer noch welche drin...
 
Ich seh jetzt eigentlich keinen Fehler mehr, aber vielleicht habe ich auch schon Sehstörungen vom vielen rumprogrammieren.
 
Code:
public void execute(GraphModel graphModel){
    Table nodeTable = graphModel.getNodeTable();
    Column col = nodeTable.getColumn(prob);

    if (col == null) {
        col = nodeTable.addColumn(prob, String.class);
    }

    Graph graph = graph.Model.getGraph();
    Node[] nodes = graph.getNodes().toArray();
    ...
    boolean change = true;

    do{
        ColumnObserver observer = col.createColumnObserver(true);
        for (Node n: nodes){
            ....
            n.setLabel(newLabel);
        }
        change = false;
        if (observer.hasColumnChanged()){
            change = true;
        }else{
            change = false;
        }
    }while(change);
    …
    ...
}
Ich finde jetzt ist er aber bildschön. sorry
 
Ich seh jetzt eigentlich keinen Fehler mehr, aber vielleicht habe ich auch schon Sehstörungen vom vielen rumprogrammieren.
Das letzte else war nicht geschlossen...
graph.Model.getGraph sieht auch dezent falsch aus...


Ich tippe mal drauf, das ColumnObserver nicht das macht, was du willst.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben