2017-06-19 4 views
0

Neu zu Swing, aber nicht zu Java. Ich versuche folgendes:Grundlegende Java Swing JFrame Repainting

public void actionPerformed(ActionEvent e) { 

methodA(); 
pane.repaint(); 
methodB(); 
pane.repaint(); 

} 

Wo methodB() lange dauert. Ich möchte es zweimal malen, aber der erste Malaufruf passiert nie. Es ist, als wenn ich es täte:

public void actionPerformed(ActionEvent e) { 

methodA(); 
methodB(); 
pane.repaint(); 

} 

Sorry, wenn diese grundlegende, aber ich habe versucht, die Suche und ich verstehe immer noch nicht, warum.

Ich habe versucht, Farbe direkt anzurufen, die wie vorgesehen funktioniert, außer dass die Anwendung auf jedem Repaint flackert.

+2

Unterschiedliches Szenario, verschiedene Aufrufe, aber gleiches Verhalten und gleiche Lösung: [Java Swing GUI friert ein] (https://stackoverflow.com/questions/11185485/java-swing-guifreezes) – BackSlash

+0

'repaint()' ist eine Anfrage, die Komponente _soon_ (nicht sofort) zu malen. Aber wenn 'methodB' lange dauert, hält es den Ereignisversand-Thread hoch und nichts wird neu gezeichnet, bis es fertig ist. Erwäge, 'methodB' in einem anderen Thread auszuführen. – khelwood

Antwort

4

actionPerformed wird im Event Dispatch Thread (EDT) aufgerufen, in dem auch das Bild ausgeführt wird, repaint kennzeichnet nur die zu übermalende Komponente. Das bedeutet, dass das Malen nur ausgeführt werden kann, nachdem actinPerformed fertig ist.

Lang laufende Aufgaben sollten nicht im EDT ausgeführt werden, verwenden Sie einen SwingWorker oder einen anderen Thread.

Zur Untersuchung angegeben Swing's Threading Policy!