2D-Grafik Bewegender Ball

mastercoll5

Aktives Mitglied
Hallo,

ich habe versucht einen kleinen Ball zu zeichnen, der von einen Rectangle abprallen soll, aber es wird erst ein kleines Fenster, dass wenn man es öffnet Schwarz ist, angezeigt und nacher kommt dann das gezeichnete Bild. Man sieht jedoch nicht die Bewegung

Hier der Text:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class paint extends JPanel implements ActionListener {
	
	Image ball;
	int x;
	int y;
	boolean xb = true;
	boolean yb = true;
	boolean key = false;

	
	public paint(){
		
		setFocusable(true);
		ImageIcon u = new ImageIcon((getClass().getResource("Ball.png")));
		ball = u.getImage();
		
		int i = 0;
		
        while(key == false) {
			
			i=i+1;
			
			if(i == 100) {
				
				key = true;
				
			}
			
			      if( x == 30) {
			    	  xb = true;
			      }
			      if( x == 750) {
			    	  xb = false;
			      }
			      if( y == 30 ) {
			        yb = true;
			      }
			      if( y == 420 ) {
			        yb = false;
			      }
			      if( xb == true ) {
			        x=x+10;
			      }
			      if( xb == false ) {
			        x=x-10;
			      }
			      if( yb == true ) {
			        y=y+10;
			      }
			      if( yb == false ) {
			        y=y-10;
			      }
			
			System.out.println("x: " + x);
			System.out.println("y: " + y);
			System.out.println("yb: " + yb);
			System.out.println("xb: " + xb);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				
			}
			
			repaint();
			
		}
		
	}
	
	public void actionPerformed(ActionEvent e){
		
		
	}
	
	public void paint(Graphics g) {
		
		super.paint(g);
		Graphics2D f2 =(Graphics2D)g;
		
		f2.setColor(Color.LIGHT_GRAY);
                f2.drawImage(ball,x,y,null);
                f2.drawRect(35, 30, 720, 390);
    
	}
}

Schonmal danke für Hilfe
 
Zuletzt bearbeitet:

KingOfExceptions

Bekanntes Mitglied
Soweit ich mich erinnere sollte man immer mit
Code:
paintComponent(Graphics g)
und nicht mit
Code:
paint(Graphics g)
arbeiten, da das das ganze JFrame zeichnet (Ränder etc). Ich weiß nicht, ob es daran liegt, aber du solltest das auf jeden Fall ändern! :)
 

mastercoll5

Aktives Mitglied
Wenn ich
Java:
PaintCompenent(Graphics g)
benutze gibt es einen Haufen an Fehlermeldungen :bahnhof:

Ne Idee woran das Liegen könnte?

EDIT: Hab vergessen auch super.paint(g) zu ändern, jedoch ist es noch dasselbe
 
Zuletzt bearbeitet:

KingOfExceptions

Bekanntes Mitglied
JComponent (Java Platform SE 7 )

Was für Fehlermeldungen gibt es denn noch?

BTW: Klassen schreibt man immer groß zB:
Code:
class BewegenderRunderBall
Methoden und Variablen schreibt man am Anfang klein zB:
Code:
bewegeRundenBall()
 
Zuletzt bearbeitet:

mastercoll5

Aktives Mitglied
Jedoch bleibt immer noch der Fehler. Während der Ball eigentlich neu gezeichnet werden soll, sieht man

Wenn dann das 100 mal zeichnen abgeschlossen ist, sieht man das gewollte Ergebnis

Eine Fehlermeldung gibt es nicht
 

Anhänge

  • Java1.PNG
    Java1.PNG
    4,4 KB · Aufrufe: 31
  • Java2.PNG
    Java2.PNG
    16,5 KB · Aufrufe: 44
Zuletzt bearbeitet:

KingOfExceptions

Bekanntes Mitglied
Legst du irgendwo die Größe des JPanels fest?
Sieht deine Methode auch so aus?
Java:
public void paintComponent(Graphics g) {
           
            super.paintComponent(g);
            Graphics2D f2 =(Graphics2D)g;
           
            f2.setColor(Color.LIGHT_GRAY);
                    f2.drawImage(ball,x,y,null);
                    f2.drawRect(35, 30, 720, 390);
       
        }

Wie rufst du denn die Klasse auf?
 
Zuletzt bearbeitet:

mastercoll5

Aktives Mitglied
Also das ist ein Startfenster, wo man die andere Klasse starten kann:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.FontUIResource;

public class Start {
	
	static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	
	public static void main(String[] args) {

		//Erzeugt ein Fenster
		final JFrame frm = new JFrame("PongPing");
		frm.setVisible(true);
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.setLayout(null);
		frm.setBounds((screenSize.width-800)/2, (screenSize.height-500)/2, 800, 500);
	    
		//Buttons werden erschaffen und ausgerichtet
	    JButton start = new JButton("Start");
	    start.setBounds(300,200,150,50);
	    
	    JButton beenden = new JButton("Beenden");
	    beenden.setBounds(300,270,150,50);
	    
	    //Ein TextFeld entsteht
	    JTextField txt = new JTextField("Spiel");
	    txt.setForeground(Color.ORANGE);
	    txt.setBounds(270, 0, 300, 200);
	    txt.setOpaque(false);
	    txt.setFont(new FontUIResource(new Font("Arial", 0, 50)));
	    txt.setEditable(false);
	    txt.setBorder(BorderFactory.createLineBorder(frm.getBackground (), 2));
	    
	    //Die Elemente werden zum Fenster hinzugefügt
	    frm.add(start);
	    frm.add(beenden);
	    frm.add(txt);
	    
	    //Das hier wird ausgeführt, wenn man die Tasten drückt
	    start.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				frm.setVisible(false);
				
				JFrame spiel = new JFrame("Spiel");
				spiel.setVisible(true);
				spiel.setForeground(Color.black);
			    spiel.add(new Paint());
				spiel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			    spiel.setBounds((screenSize.width-800)/2, (screenSize.height-500)/2, 800, 500);
			    
				
			}});
	    
	    beenden.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent e) {
	    		
	    		System.exit(0);
	    		
	    	}});
	}
}

Dann hier die Paint Klasse:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Paint extends JPanel implements ActionListener {
	
	Image ball;
	int x;
	int y;
	boolean xb = true;
	boolean yb = true;
	boolean key = false;
	
	public Paint(){
		
		setFocusable(true);
		ImageIcon u = new ImageIcon((getClass().getResource("Ball.png")));
		ball = u.getImage();
		
		int i = 0;
		
        while(key == false) {
			
			i=i+1;
			
			if(i == 100) {
				
				key = true;
				
			}
			
			      if( x == 30) {
			    	  xb = true;
			      }
			      if( x == 750) {
			    	  xb = false;
			      }
			      if( y == 30 ) {
			        yb = true;
			      }
			      if( y == 420 ) {
			        yb = false;
			      }
			      if( xb == true ) {
			        x=x+10;
			      }
			      if( xb == false ) {
			        x=x-10;
			      }
			      if( yb == true ) {
			        y=y+10;
			      }
			      if( yb == false ) {
			        y=y-10;
			      }
			
			System.out.println("x: " + x);
			System.out.println("y: " + y);
			System.out.println("yb: " + yb);
			System.out.println("xb: " + xb);
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				
			}
			
			repaint();
			
		}
		
	}
	
	public void actionPerformed(ActionEvent e){
		
		
	}
	
	public void paintComponent(Graphics g) {
		
		super.paintComponent(g);
		Graphics2D f2 =(Graphics2D)g;
		
		f2.setColor(Color.LIGHT_GRAY);
        f2.drawImage(ball,x,y,null);
        f2.drawRect(35, 30, 720, 390);
    
	}
}
 

KingOfExceptions

Bekanntes Mitglied
So wie es mir scheint wird deine GUI nicht aktualisiert. Das liegt daran, dass das Panel nicht
Code:
repainted
wird, dazu solltest du einen Thread einbauen, der diese Aufgabe parallel übernimmt.
 

Ähnliche Java Themen


Oben