Archief - [Java] paint wordt 2x aangeroepen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Curahee Q

Legacy Member
Beste

Ik ben bezig met een tetris in Java te maken. Uiteraard komt daar ook paint() bij kijken. Nu kwam ik erachter dat paint echter 2 maal wordt aangeroepen. Overbodig werk lijkt mij als hij telkens alles 2x moet tekenen.

Hier wordt de panel aangemaakt waar op wordt getekend.

Code:
import java.awt.*;
import javax.swing.*;
import java.util.*;

public class DrawPanel extends JPanel {
	
	private Vector<Blok> v;
	
	public DrawPanel(Vector<Blok> v) {
		this.v = v;
	}
	
	public void paint(Graphics g) {			
		Graphics2D g2 = (Graphics2D) g;
		
		for(int x=0; x<v.size(); x++) {
			Blok blok = v.get(x);
			Shape shape = blok.getShape();
			
			g2.setColor(blok.getColor());
			
			for(int i=0; i<shape.getWidth(); i++) {
				for(int j=0; j<shape.getHeight(); j++) {					
					if(shape.get(i, j)) {
						int start_x = j*10;
						int start_y = x*50+i*10;
						
						g2.fill3DRect(start_x, start_y, 10, 10, true);
					}
				}
			}
		}
	}
}

In main wordt hij gewoon zo aangeroepen

Code:
import javax.swing.*;
import java.awt.*;
import java.util.*;

public class Main extends JFrame {
	
	private ReadData rData = new ReadData();
	private Vector<Blok> v = new Vector<Blok>();
	
	public Main() {
		super("JTetris");
		Container content = this.getContentPane();
		
		v = rData.read("Shapes.dat");
		
		content.add(new DrawPanel(v));
		
		this.setSize(500, 500);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new Main();
	}
}

Als ik dus binnen paint() iets zet van System.out.println("test"); wordt dit altijd 2x afgedrukt. Ligt dit aan mijn code of is dat altijd zo?

Alvast bedankt

Parnakra

Legacy Member
Als ik me niet vergis leiden zowel setSize() als setVisible() automatisch tot een repaint.

Curahee Q

Legacy Member
Ik denk dat je idd gelijk hebt. Maakt niet zoveel uit dan zeker?

Cycloon

Legacy Member
Er zal wel vaker zo'n paint aangeroepen worden dan je lief hebt :). Maar als ik me niet vergis heeft java een soort van paint manager, stel dat de paint erg snel na mekaar wordt opgeroepen dan gaan sommige niet uitgevoerd worden.

Gurdt

Legacy Member
Het is misschien ook leuk om met threads te werken. Als ge een GUI hebt en een lopend onderliggend programma, gaat die GUI pas updaten als het onderliggend programma een soort van input krijgt (pop-up box of mouseclick ofzo).

Nu ik ben geen GUI-held, maar ik herinner me wel dat ik ook zo problemen had met Qt en Swing, en dat redelijk easy op te lossen was adhv een extra thread, maar later in het programma die thread daar nog in krijgen is een beetje onaangenaam natuurlijk :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan