while Schleife in Plugin stoppt nicht

CodeIt

Aktives Mitglied
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?
 
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...
 
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
 

Zurück
Oben