2D-Grafik Dynamisches Erstellen von Images und deren Animation

Blagden

Mitglied
Hallo,
ich sitze nun schon seit ca. 2 Tagen an dem Problem und habe auch schon etliches gegoogelt.
Ich wollte ein einfaches .png in bestimmten zeitlichen Abständen, an zufälligen Orten erscheinen und verschwinden lassen. Zudem sollen sich die Objekte noch im Raum bewegen.

Momentan sieht es so aus für ein einmaliges erzeugen des Images mit Bewegung.

Die main startet mein ersten Fenster:

Java:
package gui;

import graphic.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import javax.swing.*;

public class MainFrame  extends WindowFrame{
	private static final long serialVersionUID = 1L;

	public MainFrame(String name) {
		setTitle(name);
		initFrame();
		setVisible(true);
	}

    @Override
	public void initFrame(){
		
	    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
	    int frameWidth = d.width/2;
	    int frameHeight = d.height/2;
	    
	    setSize(frameWidth, frameHeight);
	    int x = (d.width - getSize().width) / 2;
	    int y = (d.height - getSize().height) / 2;
	    
	    setLocation(x, y);
	    
	    setResizable(false);
	    
      	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	    add(new CellPanel());		
	}
}

Die CellPanel()- Klasse habe ich im Netz gefunden und sieht macht schon mal das was sie soll:

Java:
package gui;

import graphic.LactoseGraphic;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class CellPanel extends JPanel implements Runnable {
	
	private static final long serialVersionUID = -4203458676349686984L;
	Image lactose;
	Thread animator;
	int x, y;
	private final int DELAY = 50;

    public CellPanel() {
        setBackground(Color.WHITE);
        setDoubleBuffered(true);
        ImageIcon ii =
	            new ImageIcon(this.getClass().getResource("/images/lactose.png"));
	    lactose = ii.getImage();
	    x = y = 10;
    }
    
    public void addNotify() {
        super.addNotify();
        animator = new Thread(this);
        animator.start();
    }


   public void paint(Graphics g) {
       super.paint(g);

       Graphics2D g2d = (Graphics2D)g;
       g2d.drawImage(lactose, x, y, this);
       Toolkit.getDefaultToolkit().sync();
       g.dispose();
   }
    
   public void cycle() {

       x += 1;
       y += 1;

       if (y > 240) {
           y = 10;
           x = 10;
       }
   }
   public void run() {

       long beforeTime, timeDiff, sleep;

       beforeTime = System.currentTimeMillis();

       while (true) {

           cycle();
           repaint();

           timeDiff = System.currentTimeMillis() - beforeTime;
           sleep = DELAY - timeDiff;

           if (sleep < 0)
               sleep = 2;
           try {
               Thread.sleep(sleep);
           } catch (InterruptedException e) {
               System.out.println("interrupted");
           }

           beforeTime = System.currentTimeMillis();
       }
   }

}

Jetzt weiß ich leider nicht weiter. Ich hatte schon probiert in der
Code:
paint(Graphics g)
Methode, das Objekt nach bestimmter Zeit mehrmalig aufzurufen, aber dann zeichnet er nichts mehr. Meine Überlegung war die Objekte in eine ArrayList zu schieben und in eine zweite Liste die zugehörigen aktuellen Koordinaten zu speichern. Dazu hatte ich auch schon was geschrieben:
Java:
        Graphics2D g2d;
        ArrayList<Graphics2D> list = new ArrayList<Graphics2D>();
        for(int i = 0; i < times;i++) {
        	g2d = (Graphics2D)g;
        	list.add(g2d);
        }
        for (int i = 0; i <list.size();i++) {
        	list.get(i).drawImage(lactose, x, y, this);
        }

Ich bin dankbar für jede Anregungen und jeden Verweis.
 

bERt0r

Top Contributor
Erstens verstehe ich nicht wieso du die Animation über addNotify starten willst - ist überhaupt garantiert dass das nicht mehrmals aufgerufen wird? Du hast ja dann pro addNotify Aufruf einen annonymen Thread der in einer Endlosschleife dahinwerkelt.
Dann sollte man in Swing nicht die paint sondern die paintComponent Methode überschreiben. Und das Graphics Objekt das die Methode übergeben bekommt sollte man nicht selber disposen, das ist die Aufgabe von dem, der es uns gegeben hat.
Für mich sieht dieses Panel eher nach AWT aus als Swing, bist du sicher dass du das richtig übernommen hast?
 

Blagden

Mitglied
Ich danke dir erstmal für die Anregungen. Ich habe mir jetzt Swing und AWT zu Gemüte geführt. Das gepostete Beispiel sollte laut der Seite das eleganteste sein.
Habe jetzt angefangen
Code:
paintComponent(Graphics g)
zu nutzen. Leider weiß ich jetzt nicht wie ich dies wiederholt ausführen kann, wie zuvor mit
Code:
repaint()
.

Java:
public class TestBild extends JPanel implements ActionListener{

	Image lactose;
	int x,y;
	ArrayList<Graphics2D> liste;
	long startZeit;
	
	public TestBild(){
		ImageIcon ii =
	            new ImageIcon(this.getClass().getResource("/images/lactose.png"));
	    lactose = ii.getImage();
	    setDoubleBuffered(true);
	    startZeit = System.currentTimeMillis();
	    liste= new ArrayList<Graphics2D>();	    
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		x=(int)(Math.random()*100);
		y=(int)(Math.random()*100);
		Graphics2D g2d = (Graphics2D)g;
		g2d.drawImage(lactose,x,y,this);
		if (liste.size()==0){
			liste.add(g2d);
		}
		
		if (startZeit-System.currentTimeMillis()==5){
			startZeit=System.currentTimeMillis();
			liste.add(g2d);
		}
    }
	
	public void actionPerformed(ActionEvent e) {
		x+=1;
		y+=1;
		repaint();
	}
}
Dies führt leider nicht zum gewünschten Erfolg, dass alle paar Millisekunden ein neues Images erscheint.
 

Blagden

Mitglied
Also durch den eingebauten Timer:
Java:
timer = new Timer(1, this);
timer.start();
läuft jetzt zumindest wieder eine Animation. Jedoch bekomme ich es nicht dynamisch hin mehrere Threads mit unterschiedlichen Bewegungen laufen zu lassen.

Hat vielleicht jemand eine Idee??
 

bERt0r

Top Contributor
Weißt du wie lange eine Millisekunde ist? new Timer(1, this); macht einen Timer der 1000 mal pro Sekunde feuert, das ist doch wirklich nicht notwendig oder?
Deine paintComponent Methode wird genau wie die paint Methode durch repaint ausgelöst. Zeitmessungen oder gar ein liste.add haben in einer paintComponent bzw. paint Methode aber nichts verloren. Du willst verschiedene Bilder zufällig am Bildschirm platzieren? Merk dir die Bilder in einer Collection, merkt dir dazugehörig Point Objekte in einer Collection, verändere die x und y werte der Point Objekte in deinem Thread/Timer und überlass der paintComponent Funktion das Zeichnen deiner Bilder auf den jeweiligen Punkten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
D Swing Dynamisches Dialog UI AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
T dynamisches Koordinatenkreuz mit scalierung AWT, Swing, JavaFX & SWT 7
C Scollpane an dynamisches GridLayout anpassen? AWT, Swing, JavaFX & SWT 3
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
trash Dynamisches Interface AWT, Swing, JavaFX & SWT 6
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3
T Swing Dynamisches Bild AWT, Swing, JavaFX & SWT 8
T RCP-SWT dynamisches ScrolledComposite AWT, Swing, JavaFX & SWT 2
B dynamisches Spektrogramm in Java-Webanwendung AWT, Swing, JavaFX & SWT 3
G LookAndFeel Dynamisches Einlesen von LookAndFeels - NullPointerException AWT, Swing, JavaFX & SWT 4
M Dynamisches generieren und ausrichten von Komponenten AWT, Swing, JavaFX & SWT 11
T Dynamisches hinzufügen und entfernen von Bildern AWT, Swing, JavaFX & SWT 3
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
J Dynamisches füllen von GridBagLayout: Größe der Komponenten AWT, Swing, JavaFX & SWT 4
S GUI, dynamisches Wechseln von JPanels in einem JFrame AWT, Swing, JavaFX & SWT 2
L Dynamisches Erzeugen eines Button AWT, Swing, JavaFX & SWT 2
M Schwieriges Label - Font - Problem "Dynamisches Label&a AWT, Swing, JavaFX & SWT 7
C Dynamisches Zuweisen von Daten an eine JTable zur Laufzeit AWT, Swing, JavaFX & SWT 4
C ActionListener für dynamisches Menü AWT, Swing, JavaFX & SWT 8
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
C Swing ImageIcon erstellen, skalieren und verwenden AWT, Swing, JavaFX & SWT 3
T src ordner erstellen AWT, Swing, JavaFX & SWT 6
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
E Putzplan erstellen AWT, Swing, JavaFX & SWT 15
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
N Kontextmenü (Popup-Fenster) erstellen AWT, Swing, JavaFX & SWT 3
L JavaFX PropertyView mit dynamischer EditCell erstellen? AWT, Swing, JavaFX & SWT 8
C Falschfarbenbild (lineare Grauwertspreizung)aus Grauwert-Bild erstellen AWT, Swing, JavaFX & SWT 15
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
Z Random Butten erstellen ohne Container AWT, Swing, JavaFX & SWT 15
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
B JavaFX RadioButtons erstellen AWT, Swing, JavaFX & SWT 7
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
K Buttons dynamisch erstellen (NetBeans) AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
dereki2000 LookAndFeel Individuelles LAF erstellen AWT, Swing, JavaFX & SWT 9
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
L Chat erstellen AWT, Swing, JavaFX & SWT 13
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
K Aus 2 Arrays xy - Graph erstellen AWT, Swing, JavaFX & SWT 9
K Swing outerPanel und innerPanel erstellen AWT, Swing, JavaFX & SWT 4
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
Timo_neu_in_java Buttons Erstellen AWT, Swing, JavaFX & SWT 6
P JList erstellen AWT, Swing, JavaFX & SWT 4
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
J Statistik erstellen AWT, Swing, JavaFX & SWT 3
H GUI erstellen um JUnit Tests auszuführen AWT, Swing, JavaFX & SWT 29
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
A Mit dem Scene Builder eine Collage erstellen (Bilder beziehen aus Flickr) AWT, Swing, JavaFX & SWT 1
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
T JavaFX Flexible Layouts dynamisch erstellen / Design-Inspirationen AWT, Swing, JavaFX & SWT 8
J JavaFX JavaFX exe erstellen AWT, Swing, JavaFX & SWT 5
E JavaFX JavaFX - MenuItem erstellen aus dem Inhalt einer HashMap AWT, Swing, JavaFX & SWT 1
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
M "(Buch-)Seiten" erstellen AWT, Swing, JavaFX & SWT 2
R AWT AWT Textfeld durch Klick auf Button erstellen? AWT, Swing, JavaFX & SWT 3
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
F JButtons erstellen lassen mit unterschiedlichen Funktionen AWT, Swing, JavaFX & SWT 3
T JPanel dynamisch erstellen AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
A Swing Frames richtig erstellen AWT, Swing, JavaFX & SWT 3
T Wizard mit NEXT Button erstellen AWT, Swing, JavaFX & SWT 11
D gerichteten Graph erstellen AWT, Swing, JavaFX & SWT 2
D Swing Ansichtstranformationsmatrix erstellen AWT, Swing, JavaFX & SWT 0
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
R Kästchen mit Zufallsfarben erstellen AWT, Swing, JavaFX & SWT 2
A Fehler bei erstellen eines JTextFields AWT, Swing, JavaFX & SWT 2
A Fenster erstellen AWT, Swing, JavaFX & SWT 2
G Label erstellen AWT, Swing, JavaFX & SWT 6
G Blöcke erstellen AWT, Swing, JavaFX & SWT 4
K Swing Terminplaner erstellen AWT, Swing, JavaFX & SWT 7
G JavaFX Neues Fenster erstellen AWT, Swing, JavaFX & SWT 3
M Wie kann ich eine an Apple Automator angelehnte GUI erstellen? AWT, Swing, JavaFX & SWT 1
T An/aus Button erstellen AWT, Swing, JavaFX & SWT 5
A Swing Transparenten JPanel erstellen AWT, Swing, JavaFX & SWT 5
D Jahreskalender erstellen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben