[Java MVC pattern] Repaint view tijdens for lus

Pagina: 1
Acties:

  • akooi
  • Registratie: December 2000
  • Laatst online: 13-12-2025
In mijn model voer ik een for lus uit. Bij elke herhaling van de lus wil ik de view updaten.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class  Model extends Observable{

    public void doeVaak(){
       for(int step = 1; step <= 1000000; step++) {    
        waarde++;
        if (waarde>6) waarde=1;
        setChanged();
        notifyObservers();      
       }
    } 
} 

public class View extends JPanel implements  Observer {

        public void update(Observable obs, Object arg){
        d = (Model) obs;
        waarde = d.getWaarde();
        repaint();      
    }
} 

de addObserver aanroep gebeurt in de superklasse. In de controller zit de button die de doeVaak methode aanroept. Probleem is nu dat bij klikken op de button gedurende de lus " down" blijft en de view niet geupdate wordt. Ook een Thread.sleep heeft hier geen invloed op.
Enig idee hoe ik dit probleem op kan lossen?

[ Voor 3% gewijzigd door akooi op 03-06-2006 14:14 ]


  • Jeldert
  • Registratie: Juni 2001
  • Niet online

Jeldert

Rozijntjes

Je kan beter gebruik maken van Threads. Zeker om de GUI en het rekenen (doeVaak) te scheiden van elkaar. Wat er nu gebeurt is dat die lus alle CPU neemt en er geen tijd meer is om de veranderingen in de GUI weer te geven.

Test bv eens met een System.out.println in de update methode of die wel wordt aangeroepen. Zou ik wel eerst die lus wat kleiner zetten (10 bv).

Juist


Verwijderd

het zou kunnen zijn dat je repaint functie niet echt wil. Zelf ook wel eens gehad.

als je nou je repaint method eens zo doet:

code:
1
2
3
public void repaint() {
     paint(getGraphics);
}


Of begrijp ik het probleem niet goed?

  • akooi
  • Registratie: December 2000
  • Laatst online: 13-12-2025
De repaint werkt wel, maar alleen na afloop van de lus. Het is dus de bedoeling tijdens elke lus een repaint uit te voeren. Kan dit zonder extra Thread?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Het heeft in dit geval niet direct iets met een Thread te maken, maar met de manier waarop UI events worden afgehandeld. De repaint wordt pas uitgevoerd zodra alle UI events zijn afgerond, wat op zich ook logisch is. Dit had je overigens zelf kunnen vinden door de API documentatie van java te bekijken:
http://java.sun.com/j2se/...int,%20int,%20int,%20int)

Blijkbaar is jouw loop vrij intensief en lang, dus dat betekent dat je je code buiten de UI Thread moet uitvoeren zodat iedere update direct door de UI wordt opgepakt. Wat je dus kunt doen is in het UI event een nieuwe thread starten waarin je doeVaak uitvoert.