In dit geval moet je feitelijk in layers denken
Als je je class UI repaint() ga je je Graphics g (die wordt aangemaakt tijdens setVisible()) opnieuw tekenen maar als je je Grid repaint ga je je grid opnieuw tekenen en toevoegen aan Graphics g alsof je er een layer op kleeft. Dus elke keer teken je een nieuwe layer bovenop de reeds bestaande layers.
Oplossing 1: Grid heeft als parent UI dus als je zegt grid.
getParent().repaint() (en grid.getParent().validate() om dat ook onmiddelijk uit te voeren) is je probleem onmiddelijk opgelost. Maar nu wordt er een 2de probleem gecreëerd... Waarom zou je alles willen herschilderen (ook bv. je achtergrond, buttons of tekeningen om de boel te verfraaien opnieuw inladen) als je enkel je grid wilt veranderen
Oplossing 2: Je veranderd de achtergrondkleur van je grid, nu heb je geen achtergrondkleur, elke keer als je nu je grid opnieuw tekent zal je de vorige achtergrond overlappen, dus weg met de doorzichtige layer
Code:
public void tekenGrid(Graphics g)
{
for (int i=0; i<10; i++)
{
for (int j=0; j<20; j++)
{
g.setColor(Color.lightGray);
g.fillRect((i*25)+20, (j*25)+20, 25, 25);
g.setColor(Color.gray);
g.drawRect((i*25)+20, (j*25)+20, 25,25);
}
}
}
oplossing 3: bij de vorige oplossing moet je nog steeds de complete grid hertekenen, in dit geval gaat het nog maar bij heel trage pc's of uitgebreidere games wil je enkel het stukje hertekenen dat veranderd, of misschien wil je wel dat de grid doorzichtig is dus ga je onthouden van welke positie de blok kwam en daarop g.clearRect() uitvoeren om dan te tekenen wat er oorspronkelijk stond