Script Verbessern

Murcer

Mitglied
Hallo,
könnte bei diese Script mal jemand drüber schauen ob das so in ordnung gescriptet ist. Also ob irgendwo noch Buggefahr bzw. ob der Stile gut verständlich etc. ist:

Das Script macht eigendlich nichts besonderes sondern zeichnet eine zufällige Anzahl an Kreisen die sich bewegen und von den Frame Rändern abprallen.
Main.java
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;


public class Main {
	
	static Zeichnen panel; //Panel Variable wird Deklariert
	
	public static void main(String[] args){
		
		
		//Neuer Thread der später auf den EDT gelegt wird
		Runnable startGUI = new Runnable() {
			
			@Override
			public void run() {
				
				//Erstellung des Frames
				JFrame frame = new JFrame("GUI Titel");
				frame.setLayout(new BorderLayout());
				
				panel = new Zeichnen();

				frame.add(panel);
				
				frame.pack();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
			
		};
		
		EventQueue.invokeLater(startGUI); //Thread wird auf den EDT gelegt
		
		
		//neuer Thread in dem die Bewegung der Kreise angestoßen wird
		new Thread(){
			
			public void run(){
				while(true){
					
					EventQueue.invokeLater(new Runnable(){

						@Override
						public void run() {
							panel.veränderPosi(); //Positionsveränderung wird angestoßen.
						}
						
					});
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			}
		}.start();
		
	}

}

Zeichnen.java
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Random;

import javax.swing.JPanel;


@SuppressWarnings("serial")
public class Zeichnen extends JPanel {
	
	private Random random = new Random();
	private int[] x; //X-Positionen von dem jeweiligem Kreis
	private int[] y; //X-Positionen von dem jeweiligem Kreis
	private int[] stepX; //Schritt Bewegungen des jeweiligen Kreises entlang der X-Achse
	private int[] stepY; //Schritt Bewegungen des jeweiligen Kreises entlang der Y-Achse
	private int[] color; //Farbe des jeweiligen Kreises
	private Color[] farben = new Color[8]; //eine Array mit 8 verschiedenen Farben
	private int anzahlBall; //die Anzahl der Bälle

	public Zeichnen(){
		
		setPreferredSize(new Dimension(500,500)); //setzt die Größe des Panels auf 500x500
		setBackground(Color.BLACK); 
		
		// Schleife die eine zufällige Anzahl von den Bällen zwischen 5 und 10 ermittelt
		do{
			anzahlBall = random.nextInt(11);
		}while(anzahlBall < 5);	
		
		//der Array wird die Größe zugewiesen
		x = new int[anzahlBall];
		y = new int[anzahlBall];
		stepX = new int[anzahlBall];
		stepY = new int[anzahlBall];
		color = new int[anzahlBall];
		
		//Array mit Farben wird initialisiert
		farben[0]  = Color.GREEN;
		farben[1]  = Color.RED;
		farben[2]  = Color.BLUE;
		farben[3]  = Color.YELLOW;
		farben[4]  = Color.MAGENTA;
		farben[5]  = Color.PINK;
		farben[6]  = Color.CYAN;
		farben[7]  = Color.ORANGE;
		
		//zufällige Start-Position, Farbe und Bewegungsgeschwindigkeit wird initialisiert
		for(int i = 0; i < anzahlBall; i++){
			
			x[i] = random.nextInt(401); //x wird ein wert zwischen 0 und 400 zugewiesen, 
			y[i] = random.nextInt(401);	//weil das Panel 500 breit ist und der Kreis einen durchmesser von 100 hat
			
			color[i] = random.nextInt(8); //Farben 0-7 werden festgelegt; später: farbe[color[i]]
			
			//Bewegungsgeschwindigkeit wird festgelegt; zwischen 1 und 5
			do{
				stepX[i] = random.nextInt(6);
			}while(stepX[i] < 1);	
			
			do{
				stepY[i] = random.nextInt(6);
			}while(stepY[i] < 1);
		}
	}
	
	@Override
	protected void paintComponent(Graphics g){
		
		super.paintComponent(g); //vorherige zeichnungen werden gelöscht
		
		// AntiAnaliasing
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		//Schleife in der ein alle Kreise(gefüllt) gezeichnet werden
		for(int i = 0; i < anzahlBall; i++){
			
			g2.setColor(farben[color[i]]);
			g2.fillOval(x[i], y[i], 100, 100);
			
		}
		
		
		
	}
	
	public void veränderPosi(){
		
		//neue Position der Kreise werden berechnet
		for(int i = 0; i < anzahlBall; i++){
			
			x[i] = x[i] + stepX[i];
			
			//Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
		    if (x[i] > 400){
				stepX[i] = stepX[i] * -1;
			}
		    else if(x[i] < 0){
		    	stepX[i] = stepX[i] * -1;
		    }
		    
		    
			y[i] = y[i] + stepY[i];
			
			//Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
		    if (y[i] > 400){
		    	stepY[i] = stepY[i] * -1;
			}
		    else if(y[i] < 0){
		    	stepY[i] = stepY[i] * -1;
		    }
		    
		}
		repaint(); //Kreise werden neu gezeichnet
	}
}

Und hier zu runterladen: File-Upload.net - Fliegende-Kreise.zip
Vielen dank schon mal!
lg Murcer
 
Zuletzt bearbeitet:
G

gman

Gast
Nette Spielerei ;)

Ich würde die Methode veränderPosi überarbeiten. Zum einen sind Umlaute im
Quelltext nicht sooo toll. Und zum anderen kann man den Code noch etwas kürzen:

Java:
public void changePosition() {

        //neue Position der Kreise werden berechnet
        for (int i = 0; i < anzahlBall; i++) {

            x[i] += stepX[i];

            //Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
            if (x[i] < 0 || x[i] > 400) {
                stepX[i] *= -1;
            }


            y[i] += stepY[i];

            //Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
            if (y[i] < 0 || y[i] > 400) {
                stepY[i] *= -1;
            }

        }
        repaint(); //Kreise werden neu gezeichnet
    }

Mir ist auch aufgefallen, das die Bälle nicht ganz den rechten und unteren Rand erreichen,
hab aber noch nicht geguckt woran es liegt.
Achja, da sich die Größe des Feldes nicht ändert, würde ich das Fenster auch in der
Größe festsetzen:

Java:
frame.setResizable(false);

HTH

PS: Das ist ein Programm, kein Script :D
 

AlexSpritze

Bekanntes Mitglied
Vielleicht wäre anstatt
Java:
//Bewegungsgeschwindigkeit wird festgelegt; zwischen 1 und 5
            do{
                stepX[i] = random.nextInt(6);
            }while(stepX[i] < 1);

folgendes besser:

Java:
//Bewegungsgeschwindigkeit wird festgelegt; zwischen 1 und 5
                stepX[i] = random.nextInt(5)+1;

Du weißt ja, dass du keine Null willst, also einfach pauschaul Eins addieren.
 

Murcer

Mitglied
Super Danke für eure Antworten! werde mein Programm gleich mal editieren.

Edit:

So hier der neue Quellcode:

Main.java
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;


public class Main {
	
	static Zeichnen panel; //Panel Variable wird Deklariert
	
	public static void main(String[] args){
		
		
		//Neuer Thread der später auf den EDT gelegt wird
		Runnable startGUI = new Runnable() {
			
			@Override
			public void run() {
				
				//Erstellung des Frames
				JFrame frame = new JFrame("GUI Titel");
				frame.setLayout(new BorderLayout());
				
				panel = new Zeichnen();

				frame.add(panel);
				
				frame.pack();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setLocationRelativeTo(null);
				frame.setResizable(false);
				frame.setVisible(true);
			}
			
		};
		
		EventQueue.invokeLater(startGUI); //Thread wird auf den EDT gelegt
		
		
		//neuer Thread in dem die Bewegung der Kreise angestoßen wird
		new Thread(){
			
			public void run(){
				while(true){
					
					EventQueue.invokeLater(new Runnable(){

						@Override
						public void run() {
							panel.changePosition(); //Positionsveränderung wird angestoßen.
						}
						
					});
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			}
		}.start();
		
	}

}

Zeichnen.java
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Random;

import javax.swing.JPanel;


@SuppressWarnings("serial")
public class Zeichnen extends JPanel {
	
	private Random random = new Random();
	private int[] x; //X-Positionen von dem jeweiligem Kreis
	private int[] y; //X-Positionen von dem jeweiligem Kreis
	private int[] stepX; //Schritt Bewegungen des jeweiligen Kreises entlang der X-Achse
	private int[] stepY; //Schritt Bewegungen des jeweiligen Kreises entlang der Y-Achse
	private int[] color; //Farbe des jeweiligen Kreises
	private Color[] farben = new Color[8]; //eine Array mit 8 verschiedenen Farben
	private int anzahlBall; //die Anzahl der Bälle

	public Zeichnen(){
		
		setPreferredSize(new Dimension(500,500)); //setzt die Größe des Panels auf 500x500
		setBackground(Color.BLACK); 
		
		// Schleife die eine zufällige Anzahl von den Bällen zwischen 5 und 10 ermittelt
		do{
			anzahlBall = random.nextInt(11);
		}while(anzahlBall < 5);	
		
		//der Array wird die Größe zugewiesen
		x = new int[anzahlBall];
		y = new int[anzahlBall];
		stepX = new int[anzahlBall];
		stepY = new int[anzahlBall];
		color = new int[anzahlBall];
		
		//Array mit Farben wird initialisiert
		farben[0]  = Color.GREEN;
		farben[1]  = Color.RED;
		farben[2]  = Color.BLUE;
		farben[3]  = Color.YELLOW;
		farben[4]  = Color.MAGENTA;
		farben[5]  = Color.PINK;
		farben[6]  = Color.CYAN;
		farben[7]  = Color.ORANGE;
		
		//zufällige Start-Position, Farbe und Bewegungsgeschwindigkeit wird initialisiert
		for(int i = 0; i < anzahlBall; i++){
			
			x[i] = random.nextInt(401); //x wird ein wert zwischen 0 und 400 zugewiesen, 
			y[i] = random.nextInt(401);	//weil das Panel 500 breit ist und der Kreis einen durchmesser von 100 hat
			
			color[i] = random.nextInt(8); //Farben 0-7 werden festgelegt; später: farbe[color[i]]
			
			//Bewegungsgeschwindigkeit wird festgelegt; zwischen 1 und 5
			stepX[i] = random.nextInt(5)+1;
			stepY[i] = random.nextInt(5)+1;
		}
	}
	
	@Override
	protected void paintComponent(Graphics g){
		
		super.paintComponent(g); //vorherige zeichnungen werden gelöscht
		
		// AntiAnaliasing
		Graphics2D g2 = (Graphics2D) g;
		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		//Schleife in der ein alle Kreise(gefüllt) gezeichnet werden
		for(int i = 0; i < anzahlBall; i++){
			
			g2.setColor(farben[color[i]]);
			g2.fillOval(x[i], y[i], 100, 100);
			
		}
		
		
		
	}
	
	public void changePosition(){
		
		//neue Position der Kreise werden berechnet
		for(int i = 0; i < anzahlBall; i++){
			
			x[i] += stepX[i];
			
			//Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
		    if (x[i] < 0 || x[i] > 400){
				stepX[i] *= -1;
			}
    
			y[i] += stepY[i];
			
			//Wenn der Kreis eine FensterSeite erreicht hat wird Bewegungsrichtung geändert
		    if (y[i] < 0 || y[i] > 400){
		    	stepY[i] *= -1;
			}
		    
		}
		repaint(); //Kreise werden neu gezeichnet
	}
}

Weitere Tipps sind trozdem noch willkommen!
 
Zuletzt bearbeitet:

agentone

Bekanntes Mitglied
Bist du ein Fan von invokeLater?
Also ich hab das in keinem einzigen Programm jemals geschrieben und die haben trotzdem funktioniert, auch wenn ein Thread läuft, der die ganze Zeit das Bild erneuert.
 
G

Gast2

Gast
Ich würde noch alle Eigenschaften der Bälle in einer Klasse Ball zusammenfassen (Farbe, Position, Richtungsvektor, Richtungsgeschwindigkeit).
Das ersparrt dir die ganzen Arrays.
 

Landei

Top Contributor
Bist du ein Fan von invokeLater?
Also ich hab das in keinem einzigen Programm jemals geschrieben und die haben trotzdem funktioniert, auch wenn ein Thread läuft, der die ganze Zeit das Bild erneuert.

Im JavaDoc steht, welche Swing-Methoden threadsafe sind und welche nicht. Wenn es trotzdem funktioniert, ist es reines Glück. Ein anderer Rechner, ein anderes Betriebssystem, eine andere JVM oder einfach mehr "Last", und das kann ganz anders aussehen.
 

Murcer

Mitglied
@Murray
Stimmt hab ich übersehen ;-)

@agentone
Schau dir mal dieses Video an. Da wird es ganz schön erklärt was da schief gehen kann.

@EikeB
Ich versteh nicht ganz wie du das machen willst. Kannst du mir ein Beispiel geben? Bin halt noch Anfänger...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
L Bubblesort in Batch Script Java Basics - Anfänger-Themen 15
F Shell Script ausführen Java Basics - Anfänger-Themen 5
L Shell Script ausführen in Java Java Basics - Anfänger-Themen 4
J script: jar Datei starten auf Mac Os Java Basics - Anfänger-Themen 2
E Compiler-Fehler Javac Windows vs Ubuntu /Script vs Konsole Java Basics - Anfänger-Themen 4
pkm javax.script.ScriptException bei der ScriptEngine Java Basics - Anfänger-Themen 9
H Kaseya2 Script Packs Java Basics - Anfänger-Themen 0
H Script ausführen wenn Browser Notification eingetroffen ist? Java Basics - Anfänger-Themen 3
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
B Java Script Zufallshintergrund Java Basics - Anfänger-Themen 2
M Script für Externes Programm Java Basics - Anfänger-Themen 6
T Änderung an Script Java Basics - Anfänger-Themen 6
D Compiler-Fehler ANT-Script geht nicht Java Basics - Anfänger-Themen 6
P ein Java Script mit Shell/Bash launchen? Ubuntu Java Basics - Anfänger-Themen 3
S Lightbox Script vs. Taco HTML Script Java Basics - Anfänger-Themen 4
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
3 Erste Schritte benötige hilfe bei diesem Script Java Basics - Anfänger-Themen 2
D script.aculo.us requires the Prototype JavaScript framework >= 1.6.0.2 Java Basics - Anfänger-Themen 2
T Shell Script Aufruf mit Java Java Basics - Anfänger-Themen 7
H sprung zu einem anderen punkt im script Java Basics - Anfänger-Themen 11
B Script Text Zeichen Suche funktioniert nicht Java Basics - Anfänger-Themen 7
B Wo ist der Fehler in meinem Script Java Basics - Anfänger-Themen 4
L vb-Script in Java ausführen Java Basics - Anfänger-Themen 3
G java shell script starten und befehl übergeben Java Basics - Anfänger-Themen 3
G Datei an PHP Script senden und speichern Java Basics - Anfänger-Themen 2
S Shell Script ausführen unter Java Java Basics - Anfänger-Themen 5
V suche nach nsis script für java applikation Java Basics - Anfänger-Themen 2
G Java-Klasse aus Java-Script aufrufen Java Basics - Anfänger-Themen 3
D kleines script abhaengig von Ordner Bilder kopieren Java Basics - Anfänger-Themen 11
G nach action Script aufrufen Java Basics - Anfänger-Themen 3
zilti PHP-Script aufrufen und Rückgabe lesen Java Basics - Anfänger-Themen 2
L Java Applet/Script wird nicht angezeigt. Java Basics - Anfänger-Themen 3
M ANT-Script - Fehlermeldung wegbekommen Java Basics - Anfänger-Themen 6
J java script mit java parsen Java Basics - Anfänger-Themen 6
J Script funktioniert nicht. Java Basics - Anfänger-Themen 4
S einfaches script mit Eingabeaufforderung starten (javac) Java Basics - Anfänger-Themen 8
O Post senden an php script. Java Basics - Anfänger-Themen 20
K VB-Script ausführen Java Basics - Anfänger-Themen 6
Turkey@mp3 Brauche nen Titelauswahl/wunsch script Java Basics - Anfänger-Themen 3
C kleines Java script mit Frage Java Basics - Anfänger-Themen 2
dennis_lnz Klassen Wie kann ich mein Java Textadventure verbessern, um ein Klassendiagramm zu erstellen? Java Basics - Anfänger-Themen 9
M Benutzereingabe eines Codes verbessern Java Basics - Anfänger-Themen 3
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
W Dezimalzahl in Binär umwandeln - Was sollte ich an meinem Programm verbessern? Java Basics - Anfänger-Themen 5
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
A Wie kann ich meinen Code verbessern? Java Basics - Anfänger-Themen 17
S rekursive folge verbessern Java Basics - Anfänger-Themen 2
P wie oop an diesem beispiel verbessern? Java Basics - Anfänger-Themen 31
F If verbessern Java Basics - Anfänger-Themen 12
S Datei-KopierProgramm ? CODE BITTE VERBESSERN Java Basics - Anfänger-Themen 11
M Quellcode verbessern Java Basics - Anfänger-Themen 6
J Algorithmen verbessern Java Basics - Anfänger-Themen 11
P Taschenrechner verbessern Java Basics - Anfänger-Themen 12
D Java Code verbessern? Java Basics - Anfänger-Themen 8
Bierhumpen mein erstes großes Programm. Was ändern? verbessern? Java Basics - Anfänger-Themen 12
A programm verbessern Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben