# Seltsamer eingeschränkter Darstellungsbereich



## Robokopp (7. Mrz 2012)

Hallo,

ich habe einen Beweglichen und skalierbaren Ball programmiert. jedoch kann ich ihn nur ungefähr bis zur Hälfte des Fensters bewegen, danach verschwindet er hinter einer unsichtbaren Kannte und an dieser Kannte bleiben sichtbare Reste des Balls hängen.

verwendet habe ich die ganz normale paint(Graphics g) Methode.

Kann mir jemand helfen?


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class GamePanel extends JPanel implements Runnable, KeyListener, ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * @param args
	 */
	JFrame frame;
	private boolean up;
	private boolean down;
	private boolean left;
	private boolean right;
	private boolean showfps=false;
	private boolean gameStarted;
	private boolean makesmaller;
	private int y=0;
	private int x=0;
	private int xStretch=20;
	private int yStretch=20;
	long delta 	= 0;
	long last 	= 0;
	long fps 	= 0;
	private boolean makebigger;
	private boolean printcoordinates;
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GamePanel(800,500);
	}
	public  GamePanel(int x, int y){
		frame = new JFrame("Ball");
		frame.setLocation(100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setPreferredSize(new Dimension(x,y));
		frame.addKeyListener(this);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
	
		Thread th = new Thread(this);
		th.start();
	}
	@Override
	public void run() {
		while(frame.isVisible()){
			checkKeys();		
			computeDelta();
			repaint();
			try {
				Thread.sleep(15);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
	public int getY() {
		return y;
	}
	public int getX() {
		return x;
	}
	private void computeDelta() {

		delta = System.nanoTime() - last;
		last = System.nanoTime();
		fps = ((long) 1e9)/delta;
		
	}
	private void checkKeys() {
		if(up){
			y=y-4;
		}	
		if(down){
			y=y+4;
		}
		if(right){
			x=x+4;	
		}
		if(left){
			x=x-4;
		}
		if(makesmaller){
			xStretch=xStretch-5;
			yStretch=yStretch-5;
		}
		if(makebigger){
			xStretch=xStretch+5;
			yStretch=yStretch+5;
		}
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if(printcoordinates){
		System.out.println("X: "+this.getX()+" Y: "+this.getY());
		}
		g.setColor(Color.red);
		
		if(showfps){
		g.drawString("FPS: " + Long.toString(fps), 20, 10);
		}
		if(gameStarted){
			
		g.drawString("Game Started",70, 10);
		g.setColor(Color.black);
		g.fillOval(x, y, xStretch, yStretch);
		super.repaint();
		}
		
		}
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			 up = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}	
		
		if(e.getKeyCode()==KeyEvent.VK_F){
			if(showfps){
			 showfps = false;
			}
			else{
				showfps=true;
			}
			System.out.println(showfps);
		}
		if(e.getKeyCode()==KeyEvent.VK_ENTER){
			if(gameStarted){
			gameStarted=false;
		
			}
			else{
				gameStarted=true;
				
				
			}
		}
		if(e.getKeyCode()==KeyEvent.VK_MINUS){
			makesmaller=true;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_PLUS){
			makebigger=true;
		}
		if(e.getKeyCode()==KeyEvent.VK_C){
			if(printcoordinates){
			printcoordinates=false;}
			else{
				printcoordinates=true;
			}
		}
	}
	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_UP){
			up = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_MINUS){
			makesmaller=false;
		}
		if(e.getKeyCode()==KeyEvent.VK_PLUS){
			makebigger=false;
		}
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
```


----------



## Marco13 (7. Mrz 2012)

Wichtig: getX / getY sind Methoden, die es in JPanel (bzw. Component) schon gibt - du hast die überschrieben, das bringt Swing durcheinander!

Ansonsten: Nicht paint überschreiben sondern paintComponent. Nicht in der paint/paintComponent "repaint" aufrufen. Räum' das ganze ein bißchen auf und Teile es in Klassen auf, ein bißchen strukturierter, nicht alles in eine Gott-Klasse klatschen (dann passiert sowas wie das mit dem getX/getY auch nicht so leicht  )


----------



## Robokopp (7. Mrz 2012)

Marco13 hat gesagt.:


> Wichtig: getX / getY sind Methoden, die es in JPanel (bzw. Component) schon gibt - du hast die überschrieben, das bringt Swing durcheinander!
> 
> Ansonsten: Nicht paint überschreiben sondern paintComponent. Nicht in der paint/paintComponent "repaint" aufrufen. Räum' das ganze ein bißchen auf und Teile es in Klassen auf, ein bißchen strukturierter, nicht alles in eine Gott-Klasse klatschen (dann passiert sowas wie das mit dem getX/getY auch nicht so leicht  )



Tatsache du Genie  ich hätte die Variablen statt x und y xPos und yPos nennen sollen wie ich es sonst auch immer mache, dann wäre das nie passiert^^

Ja klar mach ich alles noch wenn ich weiß was ich überhaupt machen will 

Vielen Dank


----------



## Quaxli (8. Mrz 2012)

Robokopp hat gesagt.:


> ....ich hätte die Variablen statt x und y xPos und yPos nennen sollen wie ich es sonst auch immer mache, dann wäre das nie passiert^^



Spendiere Deinem Ball eine eigene Klasse, die von Rectangle oder Rectangle2D.Double erbt und Du bist schmerzfrei und hast auch keine Probleme mit der Namensgebung.


----------



## Marco13 (8. Mrz 2012)

Bei Ellipse2D (Java Platform SE 6) könnte man "Contains" noch sinnvoll verwenden. (Ob man wirklich _erben_ sollte, sei mal dahingestellt: Wenn man davon ausgeht, dass der Ball rund ist (und ein Spiel neunzig Minu... ) reichen eigentlich Position (als Point2D) und Radius...)


----------

