Swing JumpingBalls GUI

maxl199

Mitglied
Hallo Community :)

Ich habe als Hausaufgabe ein Applet zur Verfügung gestellt bekommen, welches Bälle erzeugt und diese dann im Fester "herumschwirren" lässt. Nun soll ich dieses Applet in ein GUI mit JFrame umschreiben... Ich habe schonmal angefangen, aber ich habe keinen Plan wie ich die paint Methode in den Container packe...
Danke schon mal im Vorraus :)

Hier die Codes:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * gui welches die Klasse Ball verwendet und insgesamt 10 Bälle im 
 * Zeichenbereich bewegt
 */
public class JumpingBalls extends JFrame
{
	/** 
	 * Statische Membervariable, welche sich in einem Array die zu bewegenden Bälle
	 * merkt. Diese Variable darf nicht als lokale Variable innerhalb der paint-Methode
	 * definiert werden, weil sie ansonsten nach jedem Aufruf der Methode zerstört 
	 * würde. Da aber die einzelnen Ballobjekte nach dem Ende der Methode und beim
	 * nächten Auruf der paint-Methode noch leben müssen, werden diese in einer
	 * statischen Membervariable der Klasse Applet abgelegt, die auch dann noch
	 * existiert und ihre Inhalte behält, wenn ein Aufruf der paint-Methode fertig 
	 * abgearbeitet wurde 
	 */
	private static Ball[] ball = null;
	
	private JLabel l = null;
	private JTextField t = null;
	private JButton b = null;
	/**
	 * Statische Konstante, welche sich die Anzahl der zu bewegenden Bälle merkt
	 */
	private static	final int ANZAHL_BAELLE = 10;

	
	
	
	public JumpingBalls () {
		setTitle("Jumpingballs");
		setBounds(10, 10, 400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container contentPane = getContentPane();
		contentPane.setLayout();
	}
		
		/**
		 * Veranlasst dass das Programm millis Millisekunden pausiert
		 * @param millis Anzahl der Millisekunden die gewartet werden
		 */
		public void bremse(int millis) {
			try {
				Thread.sleep(millis);
			} catch (InterruptedException e) {
			}
		}
	
		/**
		 * Diese Methode wird immer dann aufgerufen, wenn der Inhalt des Applets neu 
		 * gezeichnet werden soll
		 */
		public void paint(Graphics g) {
			super.paint(g);
			// Falls noch keine Bälle vorhanden sind, wird ein Array angelegt, und
			// dieses Array nimmt dann die Ballobjekte auf, welche mit zufälligen Werten
			// gefüllt werden
			if (ball == null) {
				ball = new Ball[ANZAHL_BAELLE];
				for (int i = 0; i < ANZAHL_BAELLE; i = i + 1) {
					ball[i] = new Ball();
					ball[i].setZufaellig();
					System.out.println(ball[i].toString());
				}
			}
	
			// Dann werden die Bälle um einen Schritt über den Zeichenbereich bewegt
			for (int i = 0; i < ANZAHL_BAELLE; i = i + 1) {
				ball[i].bewege(g, getWidth(), getHeight());
	//			System.out.println(ball[i].toString());
			}
			
			// Das Programm wartet eine gewisse Anzahl von Millisekunden
			bremse(10);
			// Dann wird die repaint-Methode aufgerufen, welche nichts anderes macht als
			// die paint-Methode wieder zu starten
			repaint();
		}
	
}

Java:
import java.awt.Color;
import java.awt.*;

public class Ball
{
	private int radius = 0;
	private int x_position = 60;
	private int y_position = 80;
	private int x_richtung =  0;
	private int	y_richtung =  0;
	private java.awt.Color farbe = Color.BLACK;
	

	public void setRadius (int radius) {
		if (radius>0)
			this.radius = radius;
	}
	
	public void setXposition (int xposition) {
		if (xposition >=0)
			this.x_position = xposition;
	}
	
	public void setYposition (int yposition) {
		if(yposition >=0)
			this.y_position = yposition;
	}
	
	public void setXrichtung (int xrichtung) {
		this.x_richtung = xrichtung;
	}
	
	public void setYrichtung (int yrichtung) {
		this.y_richtung = yrichtung;
	}
	
	public void setZufaellig () {
		int radius = (int)Math.ceil(Math.random()*38+2);
		int r = (int)Math.ceil(Math.random()*255);
		int g = (int)Math.ceil(Math.random()*255);
		int b = (int)Math.ceil(Math.random()*255);
		int xrichtung;
		int yrichtung;
		do {
			xrichtung = (int)Math.ceil(Math.random()*20-10);
		} while(xrichtung==0);
		do {
			yrichtung = (int)Math.ceil(Math.random()*20-10);
		} while(yrichtung==0);
		this.radius = radius;
		this.farbe = new Color(r,g,b);
		this.x_richtung = xrichtung;
		this.y_richtung = yrichtung;
	}

	public int getRadius () {
		return radius;
	}
	
	public int getXposition () {
		return x_position;
	}

	public int getYposition () {
		return y_position;
	}
	
	public int getXrichtung () {
		return x_richtung;
	}
	
	public int getYrichtung () {
		return y_richtung;
	}
	

	public void bewege(Graphics g, int breite, int hoehe) {
		int newx = 0;
		int newy = 0;
		newx = x_position + x_richtung;
		newy = y_position + y_richtung;
		if (newx < radius) {
			newx+=(radius-newx)*2;
			x_richtung=x_richtung*-1;
		}
		if (newx > breite-radius) {
			newx+=(breite-newx-radius)*2;
			x_richtung=x_richtung*-1;
		}
		if (newy < radius) {
			newy+=(radius-newy)*2;
			y_richtung=y_richtung*-1;
		}
		if (newy > hoehe-radius) {
			newy+=(hoehe-newy-radius)*2;
			y_richtung=y_richtung*-1;
		}
		this.x_position = newx;
		this.y_position = newy;
		g.setColor(farbe);
		g.fillOval(x_position-radius, y_position-radius, getRadius()*2, getRadius()*2);
	}
	
	public String toString () {
		return ("r = "+radius+", xposition = "+x_position+", yposition = "+y_position+", " +
				"xrichtung = "+x_richtung+", yrichtung = "+y_richtung);
	}
}

Java:
public class JumpingBallsHauptprogramm
{
	public static void main(String[] args) { 
		JumpingBalls j = new JumpingBalls();
	}
}
 
M

Marcinek

Gast
Du hast die PaintMedode ja implementiert und sie überschreibt auch die Methode aus der super-Class

Aber was genau funktioiert nicht bei dir?
 

Neue Themen


Oben