Kein Zeichnen der Figuren auf JPanel

Megara

Mitglied
Hallo,

Ich versuche mich gerade an der Simulation "Bouncing Balls" in Java. Ich bin gerade dabei den Code für das JPanel vom Code für das JFrame zu trennen also in zwei unterschiedliche Klassen zu schreiben. Das Programm besitzt eine Kollisionserkennung aber noch keine Kollisionsantwort. Die soll noch folgen. Mein Problem liegt darin dass ich die Bälle nicht auf dem Panel gezeichnet bekomme.

Quellcode:
Ball.java
Code:
package figures;

import gui.BallPanel;

import java.awt.Color;
import java.awt.Graphics2D;

/**
 * 
 */
public class Ball {
	
	private final float coefficient = 100.0f;
	private final float mapFactorX  = BallPanel.panelWidth / coefficient;
	private final float mapFactorY  = BallPanel.panelHeight / coefficient;
	
	private float centerX = 0.0f;
	private float centerY = 0.0f;
	private float radius  = 0.0f;
	private String name   = null;
	
	private Ball[] myBallArray = BallPanel.myBallArray;
	
	private float dCenterX    = 0.0f;
	private float dCenterY    = 0.0f;
	private float dRadius     = 0.0f;
	private boolean collision = false;

	public float speedX = 0.0f;
	public float speedY = 0.0f;

	public Ball(float centerX, float centerY, float radius, String name) {
		this.centerX = centerX;
		this.centerY = centerY;
		this.radius  = radius;
		this.name    = name;
	}

	/**
	 * @param speedX the speedX to set
	 */
	public void setSpeedX(float speedX) {
		this.speedX = speedX;
	}

	/**
	 * @param speedY the speedY to set
	 */
	public void setSpeedY(float speedY) {
		this.speedY = speedY;
	}

	public void drawBall(Graphics2D g2d){
		g2d.setColor(Color.ORANGE);
		g2d.fillOval((int)((centerX-radius)*mapFactorX), (int)((centerY-radius)*mapFactorY), 
				(int)(radius*mapFactorX*2), (int)(radius*mapFactorY*2));
		g2d.setColor(Color.BLACK);
		g2d.drawOval((int)((centerX-radius)*mapFactorX), (int)((centerY-radius)*mapFactorY), 
				(int)(radius*mapFactorX*2), (int)(radius*mapFactorY*2));
	}

	public void update() {

		centerX += speedX;
		centerY += speedY;

		checkBorderCollision();
	}

	private void checkBorderCollision() {

		if((centerX+radius) > 100) {
			speedX = -Math.abs(speedX);
		}

		if((centerX-radius) < 0) {
			speedX = Math.abs(speedX);
		}

		if((centerY+radius) > 100) {
			speedY = -Math.abs(speedY);
		}

		if((centerY-radius) < 0) {
			speedY = Math.abs(speedY);
		}
	}

	public void checkBallCollision() {
		
		for (int i = 0; i < myBallArray.length; i++) {
			if((myBallArray[i] != this)){
				dCenterX = myBallArray[i].centerX - this.centerX;
				dCenterY = myBallArray[i].centerY - this.centerY;

				dRadius = (myBallArray[i].radius * myBallArray[i].radius) + (this.radius * this.radius);

				collision = ((dCenterX * dCenterX) + (dCenterY * dCenterY)) <= dRadius ? true : false;

				if(collision)
					System.out.println(this.name + " kolliderte mit " + myBallArray[i].name);				
			}
		}
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Ball [name=" + name + " radius=" + radius + "]";
	}
}

Board.java
Code:
/**
 * 
 */
package gui;

import javax.swing.JFrame;

public class Board extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1440466626287498855L;
	
	private final float fps = 60.0f; 

	private float dt          = 1/fps;
	private long currentTime  = System.currentTimeMillis();
	private float accumulator = 0.0f;
	private long newTime      = 0;
	private float frameTime   = 0.0f;
	private float sleepTime   = 0.0f;
	
	private BallPanel myBallPanel = null;
	
	public final static int width  = 500;
	public final static int height = 500;

	public Board(String title) {
		
		this.setTitle(title);
		this.setSize(width, height);
		this.setLocation(100,100);
		this.setResizable(false);
		myBallPanel = new BallPanel();
		this.add(myBallPanel);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		this.setVisible(true);

	public void GameLoop() {

		while(true) {
			newTime = System.currentTimeMillis();
			frameTime = (newTime - currentTime)/1000.0f;
			sleepTime = (dt - frameTime > 0) ? (dt - frameTime)*1000 : 0;

			if(frameTime > 0) {
				currentTime = newTime;
				accumulator += frameTime;
			}

			while(accumulator >= dt) {
				accumulator -= dt;

				for (int i = 0; i < BallPanel.myBallArray.length; i++)
					BallPanel.myBallArray[i].update();

				for (int i = 0; i < BallPanel.myBallArray.length; i++)
					BallPanel.myBallArray[i].checkBallCollision();
			}
			System.out.println("Alles neu macht der Winter");
			myBallPanel.repaint();

			try {
				Thread.sleep((long) sleepTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

BallPanel.java
Code:
/**
 * 
 */
package gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JPanel;

import figures.Ball;

public class BallPanel extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4316082159776838848L;

	private final static int maxBalls = 5;

	private Graphics2D g2d    = null;

	private float centerX     = 0.0f;
	private float centerY     = 0.0f;
	private float radius      = 0.0f;
	private float speedX      = 0.0f;
	private float speedY      = 0.0f;

	public static Ball[] myBallArray = new Ball[maxBalls];

	public static int panelWidth  = 0;
	public static int panelHeight = 0;

	public BallPanel() {
		setVisible(true);

		Setup();

		panelWidth = this.getWidth();
		panelHeight = this.getHeight();
	}

	private double myRandom(double low, double high) {
		return Math.random() * (high - low) + low;
	}

	public void Setup() {

		for (int i = 0; i < myBallArray.length; i++) {

			centerX = (float)(Math.round(10.0 * myRandom(0.0, 5.0)) / 10.0);
			centerY = (float)(Math.round(10.0 * myRandom(0.0, 5.0)) / 10.0);
			radius  = (float)(Math.round(10.0 * myRandom(3.0, 5.0)) / 10.0);
			speedX  = (float)(Math.round(10.0 * myRandom(0.0, 1.0)) / 10.0);
			speedY  = (float)(Math.round(10.0 * myRandom(0.0, 1.0)) / 10.0);

			myBallArray[i] = new Ball(centerX, centerY, radius, "Ball " + i);
			myBallArray[i].setSpeedX(speedX);
			myBallArray[i].setSpeedY(speedY);

			System.out.println(myBallArray[i].toString() + " wurde erstellt");
		}
	}

	@Override
	public void paintComponent(Graphics g) {
		g2d = (Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
				RenderingHints.VALUE_ANTIALIAS_ON);
		g2d.clearRect(0, 0, this.getWidth(), this.getHeight());
		g2d.setColor(Color.WHITE);
		g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
		System.out.println("Ich male");
		for (int i = 0; i < myBallArray.length; i++) {
			myBallArray[i].drawBall(g2d);
			System.out.println(myBallArray[i].toString() + " wird gemalt");
		}
	}

}

Main.java
Code:
import gui.Board;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Board myBouncingBallsFrame = new Board("Bouncing Balls");
		myBouncingBallsFrame.GameLoop();
	}

}

Vielen Dank für eure Hilfe,
Gruß,
Megara
 

Megara

Mitglied
Hallo,

Ich konnte den Fehler etwas eingrenzen. In der BallPanel-Klasse wird im Konstruktor für die Größe des Panels 0 übergeben was die Berechnung der Ballkoordinaten auch zu 0 bringt.

Ausschnitt Quellcode:
BallPanel.java
Code:
	public static int panelWidth  = 0;
	public static int panelHeight = 0;

	public BallPanel() {
		setVisible(true);

		Setup();

		panelWidth = this.getWidth();
		panelHeight = this.getHeight();
	}

Danke sehr für die Hilfe,
Gruß,
Megara
 

Harry Kane

Top Contributor
panelWidth und panelHeight werden erst gesetzt, nachdem du die Setup-Methode( btw. Methodennamen in Java werden kleingerschrieben) aufrufst. In der Setup-Methode, in der die Bälle initialisiert werden und dabei auf panelWidth und panelHeight zugreifen, sind beide noch 0.
 

Megara

Mitglied
Vielen Dank für den Hinweis aber habe es leider noch nicht hinbekommen.
Ich brauche die Höhe und die Breite des Panels welches ich auf das Frame lege für den Umrechnungsfaktor (mapFactorX/Y) in der Ball-Klasse.
Des weiteren möchte ich noch wissen wie das Panel automatisch die Größe anpasst wenn man das Frame vergrößert.

Danke sehr,
Gruß,
Megara
 

Harry Kane

Top Contributor
Ich brauche die Höhe und die Breite des Panels welches ich auf das Frame lege für den Umrechnungsfaktor (mapFactorX/Y) in der Ball-Klasse.
Ändere doch einfach die Signatur der draw-Methode in deiner Ball-Klasse und füge ein Rectangle-Argument hinzu, was die zur verfügung stehende Zeichenfläche beinhaltet. Dieses Rectangle kannst du in der paintComponent(Graphics g) Methode deines BallPanels beschaffen und an die draw-Methode der einzelnen Bälle übergeben.

Des weiteren möchte ich noch wissen wie das Panel automatisch die Größe anpasst wenn man das Frame vergrößert.
Das ist abhängig vom Layoutmanager. Die content pane eines JFrame verwendet der Default ein BorderLayout als LayoutManager. Wenn du dort dein JPanel reinlegst, sollte es sich in der Größe anpassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N imageIcon zeigt kein Bild an AWT, Swing, JavaFX & SWT 5
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
S Swing Bei start des Programmes kein Fenster zu sehen AWT, Swing, JavaFX & SWT 1
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing ImageIcon lädt kein Bild AWT, Swing, JavaFX & SWT 12
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
C JavaFX ProGuard -> TableView kein Inhalt AWT, Swing, JavaFX & SWT 7
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
P Kein Bild wird angezeigt bei ImageIcon AWT, Swing, JavaFX & SWT 16
krgewb Kein src-Verzeichnis AWT, Swing, JavaFX & SWT 1
A Swing CardLayout - kein Wechsel möglich AWT, Swing, JavaFX & SWT 5
Wurstkopp JavaFX JavaFX KeyEvent kein Zahlencode um unbekannte Mediatasten auszuwerten? AWT, Swing, JavaFX & SWT 0
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
S Kein JFrame unter Mac? AWT, Swing, JavaFX & SWT 8
F Gui weicht von Designpreview ab (kein fensterrahmen, andere größe) AWT, Swing, JavaFX & SWT 13
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
Seikuassi Swing JTextField nimmt kein Einfügen (Strg+V) an AWT, Swing, JavaFX & SWT 4
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
S Kein DnD in allen Java Applikationen AWT, Swing, JavaFX & SWT 5
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
R Bitte kein Menü bei F10 AWT, Swing, JavaFX & SWT 9
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
H TextArea zeigt kein Text an AWT, Swing, JavaFX & SWT 6
Y Kein GantChart in einem GridLayout AWT, Swing, JavaFX & SWT 5
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
S JTable erlaubt kein Komma um Dezimazahlen einzugeben..? AWT, Swing, JavaFX & SWT 2
S Swing jTextPaine kein Zeilenumbruch nach setText() AWT, Swing, JavaFX & SWT 9
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
T Editable ComboBox / kein Weiterspringen AWT, Swing, JavaFX & SWT 12
Spin Innere Klasse : kein static? AWT, Swing, JavaFX & SWT 8
G jpanel macht kein repaint AWT, Swing, JavaFX & SWT 2
V Kein Fokus für Key Bindings auf JPanel bzw JApplet AWT, Swing, JavaFX & SWT 2
G CellEditor - Kein "Textfeld" AWT, Swing, JavaFX & SWT 6
N JCalendar - Kein Datum auswählen AWT, Swing, JavaFX & SWT 3
E Hat Netbeans unter Linux kein Designer für Swing? AWT, Swing, JavaFX & SWT 3
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
W Kein MouseKlick-Event bei Bewegung AWT, Swing, JavaFX & SWT 2
B Finde kein PrintService der das Attribut PageRanges annimmt AWT, Swing, JavaFX & SWT 22
B [JTable] kein Sortieren der versteckten Columns AWT, Swing, JavaFX & SWT 9
B kein MouseEvent bei zu schneller Bewegung der Maus AWT, Swing, JavaFX & SWT 7
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
A Komponente entfernen. Kein neuzeichnen nach validate() AWT, Swing, JavaFX & SWT 2
technolion FileDialog/keine Multi-Selektion vs. JFileCHooser/kein LaF AWT, Swing, JavaFX & SWT 2
G Leider trotz allem kein Icon :( Brauche Hilfe AWT, Swing, JavaFX & SWT 3
M Problem mit verschachtelten Events und kein ausweg in sicht AWT, Swing, JavaFX & SWT 3
Z kriege kein paint AWT, Swing, JavaFX & SWT 13
B Kein Repaint während eines Prozesses. AWT, Swing, JavaFX & SWT 5
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
K jTable - kein repaint? AWT, Swing, JavaFX & SWT 9
D JDialog: kein Icon nach setResizeable(false) AWT, Swing, JavaFX & SWT 5
K Kein Header in JTable ! AWT, Swing, JavaFX & SWT 8
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
J Tabelle zeigt kein Header AWT, Swing, JavaFX & SWT 5
A Ich kann kein JInternalFrame anzeigen ! AWT, Swing, JavaFX & SWT 7
G für showInputDialog kein eigenes Icon auswählen AWT, Swing, JavaFX & SWT 6
R JTextField - setBackground - kein Effekt AWT, Swing, JavaFX & SWT 5
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben