Graphics2D problem

  • Themenstarter Themenstarter MM
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

MM

Gast
Hallo

Warum funktioniert dass nicht.

Code:
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
 
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
 
funktioniert trotzdem nicht. hm dass was ich in g2 gezeichnet habe bewegt sich nicht wenn ich links drücke.

MFG
 
der Thread verwendet ein anderes Zeichnung-Objekt als in der GUI angezeigt wird
 
So jetz hab ich ma diesen Code geschinpselt. ^^
Aber es ruckielt noch immer ein bisschen warum?

Code:
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
 
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben