Problem mit Thread

Hallo.

Gegeben:

  • Ein Graph ist zunächst gegeben (visuell sichtbar).
  • Dann werden einige Knoten rausgefiltert.
  • Der Graph soll daraufhin neu gemalt werden.
  • DANACH sollen die sichtbaren Knoten gesammelt werden (in einer Liste).

Abstrakt geht es um die folgenden Methoden

public void filter(){
filterSomeNodes();
repaintGraph();
getVisibleNodes();
filterEdges();
}

Frage: Wie kann man sicherstellen, dass zuerst der Graph neu gemalt wird und erst dann die Methode getVisibleNodes() ausgeführt wird?

Problem: Das Problem ist, dass die repaint-Methode in einem separaten Thread abläuft und die Methode getVisibleNodes() ausgeführt wird, bevor der Graph neu gemalt ist.

Danke für jede Antwort.

Frage: Wie kann man sicherstellen, dass zuerst der Graph neu
gemalt wird und erst dann die Methode getVisibleNodes()
ausgeführt wird?

Du musst in der paint-Methode, die deinen Graph letztlich zeichnet und die in einem separaten Thread ausgeführt wird, eine Variable setzen.

Die kannst du dann abfragen, und erst weitermachen, wenn der Graph repainted ist.

Also etwas so:

class Graph {

 boolean painted = false;

 paintComponent(Graphics g) {
 // Graph zeichnen... 
 ...
 // Am schluss painted auf true setzen.
 painted = true;
 }



 public void filter(){ 
 filterSomeNodes();

 // Painted auf false setzen und repaint veranlassen
 painted = false;
 repaintGraph();

 // Solange warten, bis painted auf true gesetzt wurde,
 // d.h. bis der Graph fertig gezeichnet ist
 while (!painted) {
 Thread.sleep(10);
 }

 // Erst dann sichtbare knoten auslesen
 getVisibleNodes();
 filterEdges();
 }

}

Aber etwas anderes:
Wieso musst du den Graph neu zeichnen bevor du die sichtbaren Knoten ausliest? Das deutet darauf hin, dass du nicht sauber zwischen Anzeige und Logik in deinem Programm unterscheidest. Normalerweise sollte sich dein Problem von vorneherein überhaupt nicht stellen.

Aber etwas anderes:
Wieso musst du den Graph neu zeichnen bevor du die sichtbaren
Knoten ausliest? Das deutet darauf hin, dass du nicht sauber
zwischen Anzeige und Logik in deinem Programm unterscheidest.
Normalerweise sollte sich dein Problem von vorneherein
überhaupt nicht stellen.

Das war leider vorgegeben, d.h. das Programm stand nicht ursprünglich von mir und darauf musste aufgebaut werden.

Moien

Frage: Wie kann man sicherstellen, dass zuerst der Graph neu
gemalt wird und erst dann die Methode getVisibleNodes()
ausgeführt wird?

Am simplsten indem du 2 Graphen speicherst: einen den repaint/paint sehen kann und einem an dem du arbeitest. Wenn du fertig bist mit Arbeiten kannst du die Arbeitsversion der paint-Methode zugänglich machen.

cu