# Graphics2D problem



## MM (12. Nov 2007)

Hallo

Warum funktioniert dass nicht.


```
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Arc2D;

import javax.swing.JFrame;
import javax.swing.JPanel;



class Zeichnung extends JPanel implements Runnable
{
	double w = 50;
	double x = 50;
	
	
	protected void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
						    RenderingHints.VALUE_ANTIALIAS_ON);
		
		Shape arc = new Arc2D.Double(w,x,60,60,30,120,Arc2D.PIE);
		((Graphics2D)g).draw(arc);
	}	

	public void run() {	
		while(true)
		{
			repaint();
		try
		{ 
			w++;
			System.out.println(w);

		Thread.sleep (20);

		}
		catch (InterruptedException e)
		{ 

		}
		}
	
	}
}

public class test{	

	public static void main (String[] args)
	{
	JFrame f = new JFrame();
	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	f.setSize(500,500);	
	f.setVisible(true);	
	f.add(new Zeichnung());
	
	final Thread t1 = new Thread(new Zeichnung());
	
	f.addKeyListener(new KeyListener()
	{
		public void keyPressed(KeyEvent event) {
			if (event.getKeyCode() == KeyEvent.VK_LEFT)
			{
				t1.start();
			}
		}

		public void keyReleased(KeyEvent VK_LEFT) {
			
			
		}

		public void keyTyped(KeyEvent VK_LEFT) {
			
		}		
	});
	}
}
```

MFG
Exodus


----------



## SlaterB (12. Nov 2007)

alles was du nach 
f.setVisible(true);    
einfügst ist nicht in den Anfangslayout-Prozess eingebunden,
kann man mit validate() und ähnlichem zu reparieren versuchen,

besser aber Unterpanels vor
f.setVisible(true);    
einfügen


----------



## MM (12. Nov 2007)

funktioniert trotzdem nicht. hm dass was ich in g2 gezeichnet habe bewegt sich nicht wenn ich links drücke.

MFG


----------



## SlaterB (12. Nov 2007)

der Thread verwendet ein anderes Zeichnung-Objekt als in der GUI angezeigt wird


----------



## Exodus (12. Nov 2007)

So jetz hab ich ma diesen Code geschinpselt. ^^
Aber es ruckielt noch immer ein bisschen warum?


```
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.Arc2D;
import java.awt.image.BufferedImage; 
import java.awt.image.VolatileImage;

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Game extends JPanel{    
    
 
   //Kugel 
    private double w = 100; 
    private double x = 100; 
    
    long last = 0; 
    long delta = 0; 
    double mod = 1000000000; 
    int speed = 150; 

    private boolean up = false; 
    private boolean down = false; 
    private boolean left = false; 
    private boolean right = false; 
    
Image offscreenImage;
Graphics offscreenGraphics;    

    protected void paintComponent(Graphics g) 
    { 
       super.paintComponent(g); 
       Graphics2D g2 = (Graphics2D) g; 
        
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    		   			   RenderingHints.VALUE_ANTIALIAS_ON); 
        
       Shape arc = new Arc2D.Double(w,x,60,60,30,120,Arc2D.PIE); 
       ((Graphics2D)g).draw(arc); 
    }    

    
    public void doIt() { 
        try { 
            
            while (true) { 
                
              if(last==0){ 
                last = System.nanoTime(); 
              }else{ 
                delta = System.nanoTime() - last; 
                last = System.nanoTime(); 
              } 
                
                if (left) { 
                   w -= speed*(delta/mod); 
                } 
                if (right) { 
                   w += speed*(delta/mod); 
                } 
                if (up) { 
                   x -= speed*(delta/mod); 
                } 
                if (down) { 
                   x += speed*(delta/mod); 
                } 
                
                Thread.sleep(10); 
                repaint() ; 
            } 
            
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 

    public static void main(String[] args) {         

        JFrame f1 = new JFrame(); 
        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f1.setResizable(false); 
        f1.setSize(800, 600); 

        Game ga = new Game(f1); 
        f1.getContentPane().add(ga); 
        f1.add(ga); 
        f1.setVisible(true); 
        
        ga.doIt(); 

    } 


    Game(JFrame jf) {              
        KeyListener al1 = new MyListener(); 
        jf.addKeyListener(al1);         
    } 

    class MyListener implements KeyListener { 

        public void keyPressed(KeyEvent event) { 
            switch (event.getKeyCode()) { 
            case (KeyEvent.VK_LEFT): 
                left = true; 
                break; 
            case (KeyEvent.VK_RIGHT): 
                right = true; 
                break; 
            case (KeyEvent.VK_UP): 
                up = true; 
                break; 
            case (KeyEvent.VK_DOWN): 
                down = true; 
                break; 
            } 
        } 

        public void keyReleased(KeyEvent event) { 
            switch (event.getKeyCode()) { 
            case (KeyEvent.VK_LEFT): 
                left = false; 
                break; 
            case (KeyEvent.VK_RIGHT): 
                right = false; 
                break; 
            case (KeyEvent.VK_UP): 
                up = false; 
                break; 
            case (KeyEvent.VK_DOWN): 
                down = false; 
                break; 
            } 
        } 

        public void keyTyped(KeyEvent arg0) { 
        } 
    } 
}
```

MFG


----------



## SlaterB (13. Nov 2007)

wenn die Taste gedrückt gehalten wurde, dann merke dir 1x die Startzeit und berechne die aktuelle Posititon relativ zur Startzeit,
so hast du eine gleichmäßigere Bewegung

aber ob man die mit den einfachen Swing-Mitteln gleichmäßig darstellen kann ist noch eine andere Frage..,
zeichne wenn möglich nur einen kleinen Ausschnitt der GUI neu,
kenne die Fachbegriffe dazu nicht, Clipping oder so


----------

