1. #1
    Curahee Q's Avatar
    Registered
    07/12/07
    Location
    Hoogstraten
    Posts
    854
    iTrader
    0
    Mentioned
    0 Post(s)

    [Java] paint wordt 2x aangeroepen

    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
    no votes  

  2. #2
    Parnakra's Avatar
    Registered
    15/04/04
    Location
    Izegem
    Posts
    6,095
    iTrader
    1 (100%)
    Mentioned
    0 Post(s)
    Als ik me niet vergis leiden zowel setSize() als setVisible() automatisch tot een repaint.
    no votes  

  3. #3
    Curahee Q's Avatar
    Registered
    07/12/07
    Location
    Hoogstraten
    Posts
    854
    iTrader
    0
    Mentioned
    0 Post(s)
    Ik denk dat je idd gelijk hebt. Maakt niet zoveel uit dan zeker?
    no votes  

  4. #4
    Cycloon's Avatar
    Registered
    18/01/04
    Location
    Melle
    Posts
    10,535
    iTrader
    56 (100%)
    Mentioned
    0 Post(s)
    Reputation
    27/102
    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.
    “In terms of how we evaluate schooling, everything is about working by yourself. If you work with someone else, it’s called cheating. Once you get out in the real world, everything you do involves working with other people.”
    PSN: Cycloon - Final Fantasy XIV: A realm reborn character
    no votes  

  5. #5
    Gurdt's Avatar
    Registered
    21/08/08
    Location
    Hasselt
    Posts
    2,653
    iTrader
    8 (100%)
    Mentioned
    0 Post(s)
    Reputation
    5/46
    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
    no votes  

  6. #6
    NeverwinterX's Avatar
    Registered
    27/08/04
    Location
    Leuven
    Posts
    930
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    11/38
    Het wordt overigens aangeraden om paintComponent() te overriden en niet paint().
    Painting in AWT and Swing

    En het is waarschijnlijk beter om setPreferredSize() te gebruiken ipv setSize().
    Java: Difference between the setPreferredSize() and setSize() methods in components - Stack Overflow
    no votes  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in