Problem beim animieren von Bildern in Applet

Status
Nicht offen für weitere Antworten.

lcv

Mitglied
Hallo,
ich habe ein Applet und möchte ein kleines Bild darin von unten nach oben über den Bildschirm wandern lassen.
Das Bild habe ich nun eingefügt.
Wie mache ich den Rest?
Hab schon mal gegoogelt aber nicht richtiges gefunden!
Außer dass man wohl mit Threads arbeiten muss.

Anbei mein Code bis zu diesem Zeitpunkt.

Hoffe ihr könnt mir helfen!

Vielen Dank

LCV


Code:


Java:
import java.awt.event.*;
import java.applet.Applet;
import java.util.EventListener;


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


public class Strasse extends JApplet 

{
   
        Image bild;
        Image auto;
        Thread runner = null;
 

    public void init()
    {
         bild = getImage(getCodeBase(), "bild.jpg");
       

        JRadioButton c1 = new JRadioButton("a", true);
        JRadioButton c2;
        c2 = new  JRadioButton("b");
        JRadioButton c3;
        c3 = new  JRadioButton("cr");
        JRadioButton c4;
        c4 = new  JRadioButton("d"); 

        ButtonGroup bg = new ButtonGroup();
        bg.add(c1);
        bg.add(c2);
        bg.add(c3);
        bg.add(c4);
        
        JPanel p = new JPanel();
        getContentPane().add(p);
        p.add(c1);
        p.add(c2);
        p.add(c3);
        p.add(c4);

        p.setSize(50,50);
        p.setVisible(true);

   
    if (c1.isSelected())
    {
        autofahren();

    }
    else if (c2.isSelected())
    {
        
    }
    else
    {
        
    }
   
}  
 
        
            public void paint(Graphics g)
    {
        super.paint(g);

        g.drawImage(bild,5,100,this);
        g.drawImage(auto,240,550,this);

    }
    

    public void autofahren(){
            auto = getImage(getCodeBase(), "auto.gif");
       }
   
  
   
    public String getAppletInfo()
    {
        
    }

     public void start() {
 
     if ( runner == null ) {
 
         runner = new Thread( this );
         runner.start();
     }
     
 }
     
     public void stop() {
 
      if ( runner != null && runner.isAlive() )
          runner.stop();
 
     runner = null;
 }
}
 
Zuletzt bearbeitet von einem Moderator:
M

MiDniGG

Gast
Hi,

leg Dir 2 globale Variablen an. int x und int y o.ä. dann bau Dir einen Thread. In etwa:

Java:
new Thread(new Runnable() {
    ..run() {
      y++;
      repaint();
      try {
         Thread.sleep(1000);
      } catch(Exception e) {
         e.printStackTrace();
      }
    }
}).start();
Wie die run-Methode genau aussieht weiß ich grad ned auswendig -.-
Durch das y++; wird der y-Wert um 1 erhöht. Sprich das Teil geht ein Schritt hoch :)
Das repaint(); bewirkt, dass das "Feld" neu gezeichnet wird.
Und mit dem Thread.sleep(); bewirkst Du, dass der Thread x millisekunden anhält und somit eine Bewegung (und nicht ein Sprung) sichtbar wird.

Ich hoffe das hilft Dir. Wenn nicht google einfach mal ein wenig nach Threads in java oder animation in java oder was weiß ich ^^
 

lcv

Mitglied
Hallo,
hab das jetzt mal so eingebaut. Bin mir aber nicht sicher an welche stelle der Thread muss. Außerdem kommt bei der Zeile new Thread(new Runnable() { eine illegal start of type Fehlermeldung!
Was muss ich denn noch ändern?
und kann ich einfach bei dem Bildaufruf den startwert+ y machen?


Java:
import java.awt.event.*;
import java.applet.Applet;
import java.util.EventListener;


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


public class Test extends JApplet implements Runnable

{
   
        Image bild;
        Image auto;
        int y = 0;
        int x = 0;
 

    public void init()
    {
       

        bild = getImage(getCodeBase(), "bild.jpg");
       

        JRadioButton c1 = new JRadioButton("Eins", true);
        
         JRadioButton c2;
        c2 = new  JRadioButton("Zwei");
        
        
          JRadioButton c3;
        c3 = new  JRadioButton("Drei");
        
                  JRadioButton c4;
        c4 = new  JRadioButton("Vier"); 

        ButtonGroup bg = new ButtonGroup();
        bg.add(c1);
        bg.add(c2);
        bg.add(c3);
        bg.add(c4);
        
        JPanel p = new JPanel();
        getContentPane().add(p);
        p.add(c1);
        p.add(c2);
        p.add(c3);
        p.add(c4);

        p.setSize(50,50);
        p.setVisible(true);


   
    
    if (c1.isSelected())
    {
        autofahren();

    }
    else if (c2.isSelected())
    {
        
    }
    else
    {
        
    }
    
    
}

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

        g.drawImage(bild,5,100,this);
       

    }
    

    public void autofahren(){
            auto = getImage(getCodeBase(), "auto.gif");
            



        }
   
  
   
    public String getAppletInfo()
    {
    }
   
    new Thread(new Runnable() {
    public void run() {
      y++;
      paint();
      try {
         Thread.sleep(1000);
      } catch(Exception e) {
         e.printStackTrace();
      }
    }
}

    
   
}


Vielen Dank für die Hilfe!
Gruß lcv
 
Zuletzt bearbeitet von einem Moderator:
M

MiDniGG

Gast
1.) Benutze die [JAVA ]-Tags!
2.) Les Dir ein Kapitel über Threads durch...
3.) pack den new Thread...-Teil in eine Methode die Du zu gegebener Zeit (bspw. beim Programmstart) aufrufst.
 

lcv

Mitglied
was muss denn in die Methode paint();???
An dieser Stelle meckert es immer!
cannot find symbol!
Danke
 

lcv

Mitglied
Ok. Das habe ich schon gefunden! Geht mit repaint();
Aber eine andere Frage habe ich noch!
Der Code funktioniert nun ohne Syntaxfehler!
Aber das Auto ist noch nicht animiert!
Wo liegt mein Fehler??


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

        g.drawImage(bild,5,100,this);
       g.drawImage(auto,x,y,this);

    }
    

    public void autofahren(){
        
        auto = getImage(getCodeBase(), "auto.gif");
                new Thread(new Runnable() {
                    public void run() {
                        y++;
                        repaint();
                        try {
                            Thread.sleep(1000);
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                    
                }
                    );
        

        }
Danke und Gruß,
LCV
 
Zuletzt bearbeitet von einem Moderator:

lcv

Mitglied
ok. Oops. Aber an welche Stelle muss das denn?

new Thread(this).start(); müsste es ja sein.
Aber wohin ist mir noch nicht ganz klar! In die run Methode kommt das ja nicht mehr oder?
Danke und Gruß,
lcv
 

Verjigorm

Top Contributor
du hast doch schon ein Codebeispiel mit autofahren, da nur noch das .start an den Thread anhängen.

Wenn das Ganze animiert sein will, muss aber auch noch eine Endlosschleife in deine run-Methode
 

Quaxli

Top Contributor
Nachdem man nicht wirklich sieht, was Du bis jetzt wie gemacht hast, habe ich mal ein Beispiel gebastelt:

Java:
import java.awt.*;
import javax.swing.*;

public class Test extends JApplet implements Runnable {

	private static final long	serialVersionUID	= 1L;

	Image	bild;
	int	y	= 100;
	int	x	= 0;
	boolean	active = true;

	public void init() {

		this.setPreferredSize(new Dimension(300, 300));
		bild = getImage(getCodeBase(), "bild.gif");

		Thread t = new Thread(this);
		t.start();

	}

	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(bild, x, y, this);

	}

	public void run() {

		while (active) {

			x++;
			repaint();

			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
			}

		}

	}
}
 

lcv

Mitglied
Super vielen vielen Dank es funktioniert!

Ein kleines Problem gibt es noch! Wenn das Auto sich bewegt, dann flackert das Hintergundbild. Woran liegt das denn? Sonst ist super, aber wenns flackert als sieht das ja doof aus.

Grüße und viele Dank,
lcv
 

Verjigorm

Top Contributor
Ohne genauen Code isses sehr schwer das zu beurteilen
Lädst du das Bild eventuell IMMER neu oder zeichnest du es nur neu?
 

lcv

Mitglied
Hallo nochmal,

hier mal der Quelltext....
Java:
import java.awt.event.*;
import java.applet.Applet;
import java.util.EventListener;


import java.awt.*;
import javax.swing.*;
import java.util.Random;

/**
 * Class Test
 * 
 * @author 
 * @version 1
 */
public class Testn extends JApplet 

{


   
        Image bild;
        Image auto;
        int y = 550;
        int x = 240;

 

    public void init()
    {
       

        bild = getImage(getCodeBase(), "bild.jpg");
         auto = getImage(getCodeBase(), "auto.gif");
       

        JRadioButton c1 = new JRadioButton("Keine Fussgänger", true);
        
         JRadioButton c2;
        c2 = new  JRadioButton("Ein Fussgänger");
        
          JRadioButton c3;
        c3 = new  JRadioButton("Zwei Fussgänger");
        
                  JRadioButton c4;
        c4 = new  JRadioButton("Zufällige Wiedergabe"); 

        ButtonGroup bg = new ButtonGroup();
        bg.add(c1);
        bg.add(c2);
        bg.add(c3);
        bg.add(c4);
        

        JPanel p = new JPanel();
        getContentPane().add(p);
        p.add(c1);
        p.add(c2);
        p.add(c3);
        p.add(c4);

        p.setSize(50,50);
        p.setVisible(true);


   
    
    if (c1.isSelected())
    {
        autofahren();

    }
    else if (c2.isSelected())
    {
        System.out.println("Test2");
    }
    else
    {
        System.out.println("Achtung");
    }
    

}

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

        g.drawImage(bild,5,100,this);
       g.drawImage(auto,x,y,this);
                       
    }
    

    public void autofahren(){
             
       
                new Thread(new Runnable() {

                    public void run() {
                        while (y > 0) {
                                           
                        y=y-1;
                        repaint();
                        try {
                            Thread.sleep(1);
                            
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                }
                    ).start();


                    





        }
   
  
   
    public String getAppletInfo()
    {
        return "Title: Test   \nAuthor: Test   \n";
    }
   

    
   
}
 

Verjigorm

Top Contributor
Thread.sleep(1); ?
Du willst alle 1 Millisekunde neuzeichnen?

Unter 10 Millisekunden ist meist nichtmehr für das System realisierbar.
Normalerweise sollten 100 ms reichen
 

lcv

Mitglied
Hab doch noch eine Frage! Also ersten Flackert es immer noch. Ist mir nicht gleich aufgefallen! Nur seltener! Woran kann das noch liegen?
Und dann ist das Bild sehr langsam. Wie kann ich die Geschwindikeit anpassen?
Habs schon versucht mit y= y - 50 oder so. Dann fängt das Auto aber an zu hüpfen und fährt nicht mehr!
Gruß und vielen Dank.
LCV
 
M

MiDniGG

Gast
Zum zweiten Problem musst Du einfach die sleep Zeit anpassen. Je kürzer du schläfst umso schneller "fährt" das Auto.
Natürlich kannst Du auch die Sprungweite erhöhen. Aber mehr als +/- 5 würde ich nicht machen, da das Auto sonst eben "hüpft"

Edit: Gegen zu arges flackern sollte ein BufferedImage helfen..
 

Quaxli

Top Contributor
Du kannst es auch abhänging von der Zeit, die der letzte Schleifendurchlauf benötigt hat bewegen, um eine möglichst gleichförmige Bewegung zu erzielen.
Guck mal in das Tutorial in meiner Signatur, da findest Du ein Beispiel - zwar nicht für Applets, aber die Logik ist die gleiche.
 

Verjigorm

Top Contributor
Lad das Bild als BufferedImage per ImageIO.read()
Alternativ kannst du repaint() auch mit Koordinaten deines animierten Bildes (etwas größer als das eigentlich Bild, da es sich ja bewegt) aufrufen, dann wird nur dieser kleine Bereich neugezeichnet
 
Zuletzt bearbeitet:

lcv

Mitglied
Also mir kommt es vor als würde die Zeile Thread.sleep(40); komplett übersprungen werden. Weil ob ich da 40 oder 100 eintrage da ändert sich nichts ersichtbar. oder ob da 1000 steht. Ist da vllt noch was falsch. Habs ja selber auch vorher gedacht dass ich damit die geschwindigkeit änder. Aber bei sleep ändert sich nix.

Danke für die Hilfe.

Vllt ist dadurch auch das Flackern..!
 

lcv

Mitglied
Kann mir jemand bei dem Problem helfen?
Wie mach ich dass denn jetzt?
HILLLLFEEEEEEEE!
Sonst ist ja top. Aber ich muss das doch schneller machen können und ohne Flackern!

Quellcode: Siehe meine vorletzte Antwort!

Danke
 

André Uhres

Top Contributor
Wenn ich das so mache wie es hier steht:
Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki
dann flackert gar nix:
Java:
import java.awt.*;
import javax.swing.*;
public class Testn extends JApplet {
    Image bild;
    Image auto;
    int y = 550;
    int x = 240;
    @Override
    public void init() {
        bild = getImage(getCodeBase(), "bild.jpg");
        auto = getImage(getCodeBase(), "auto.gif");
        JRadioButton c1 = new JRadioButton("Keine Fussgänger", true);
        JRadioButton c2;
        c2 = new JRadioButton("Ein Fussgänger");
        JRadioButton c3;
        c3 = new JRadioButton("Zwei Fussgänger");
        JRadioButton c4;
        c4 = new JRadioButton("Zufällige Wiedergabe");
        ButtonGroup bg = new ButtonGroup();
        bg.add(c1);
        bg.add(c2);
        bg.add(c3);
        bg.add(c4);
        JPanel p = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(bild, 5, 100, this);
                g.drawImage(auto, x, y, this);
            }
        };
        getContentPane().add(p);
        p.add(c1);
        p.add(c2);
        p.add(c3);
        p.add(c4);
        p.setSize(50, 50);
        p.setVisible(true);
        if (c1.isSelected()) {
            autofahren();
        } else if (c2.isSelected()) {
            System.out.println("Test2");
        } else {
            System.out.println("Achtung");
        }
    }
    public void autofahren() {
        new Thread(new Runnable() {
            public void run() {
                while (y > 0) {
                    y = y - 1;
                    repaint();
                    try {
                        Thread.sleep(1);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
    @Override
    public String getAppletInfo() {
        return "Title: Test   \nAuthor: Test   \n";
    }
}
 

lcv

Mitglied
Hey danke genau das war die Lösung. Jetzt flackert nix mehr! vielen Dank für die schnelle Hilfe!
Liebe Grüße,
LCV
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
F Problem beim Speichern eines Attachments Allgemeine Java-Themen 3
M Problem beim Starten der Anwendung Allgemeine Java-Themen 3
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
GUI-Programmer JNI - Problem beim Erstellen der .dll Allgemeine Java-Themen 9
D Problem mit Referenzen beim Serialisieren Allgemeine Java-Themen 3
R Problem beim vCard Manipulieren Allgemeine Java-Themen 2
Rudolf Problem beim Visitorpattern Allgemeine Java-Themen 2
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
U Mailclient über getDesktop.mail vorbereiten, Problem beim Anhang: Allgemeine Java-Themen 3
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
N Problem beim lesen einer File in JAR-File Allgemeine Java-Themen 3
N iText Problem beim verlinken anderer PDFs Allgemeine Java-Themen 2
M Problem beim Drucken von PDFs Allgemeine Java-Themen 3
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
I Problem beim Ausführen von Shell Commandos Allgemeine Java-Themen 3
O Problem beim Ausgeben von Arrays Allgemeine Java-Themen 9
C Problem beim einlesen bestimmter Seiten Allgemeine Java-Themen 5
Apo JNI-Problem beim erneuten Laden einer dll Allgemeine Java-Themen 28
S Problem beim Drucken auf Netzwerkdrucker unter Linux Allgemeine Java-Themen 9
S Problem beim Anlegen eines JDialogs! Allgemeine Java-Themen 4
A Problem mit ShutdownHook beim schließen Allgemeine Java-Themen 7
S Problem beim Löschen des Inhalts des Fensters Allgemeine Java-Themen 4
A Problem beim serialisieren/deserialisieren einer ArrayList Allgemeine Java-Themen 3
M Problem beim Umrechnen von Pixel in cm. Allgemeine Java-Themen 6
M Problem beim ausführen von Batchdateien Allgemeine Java-Themen 21
Escorter Problem beim starten von Batchfiles Allgemeine Java-Themen 4
A Problem beim Starten der H2-Datenbank Allgemeine Java-Themen 4
L WindowsTrayIcon in Java 1.4 - Problem beim ausführen der JAR Allgemeine Java-Themen 2
E Problem beim Anlegen einer Datei Allgemeine Java-Themen 4
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
G Problem beim starten von eclipse product Allgemeine Java-Themen 2
M Problem beim Erstellen eines Objektes Allgemeine Java-Themen 3
M Problem beim laden von vielen Bildern Allgemeine Java-Themen 16
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
H Problem beim Malen auf ein Panel Allgemeine Java-Themen 2
G iText: Problem beim Drucken von AcroFormen Allgemeine Java-Themen 2
E Problem beim fertigen Programm die Hintergrundfarbe ändern Allgemeine Java-Themen 8
karambara Sonderzeichen-Problem beim Lesen und Speichern von Dateien Allgemeine Java-Themen 6
R Problem beim Datentransfer Allgemeine Java-Themen 19
C Problem beim Umstieg von Java1.4 auf 1.5 Allgemeine Java-Themen 5
K javax.comm Problem beim starten aus .jar heraus Allgemeine Java-Themen 3
S Problem beim Bearbeiten von Java-Dateien unter Linux Allgemeine Java-Themen 3
S Hab ein Problem! Bei Dame! Beim Umranden! Allgemeine Java-Themen 2
G Problem beim speichern von Dateien Allgemeine Java-Themen 8
M Problem mit PageFormat beim Drucken Allgemeine Java-Themen 2
Streeber Problem beim Kompilieren und Ausführen Allgemeine Java-Themen 20
E Problem beim Compilieren Allgemeine Java-Themen 6
O JNI Problem beim kompilieren Allgemeine Java-Themen 2
M Codepage Problem (Vertauscht Zeichen beim Lesen aus Datei) Allgemeine Java-Themen 3
P Problem beim "spliten" eine Textdatei Allgemeine Java-Themen 3
F Problem beim Drucken mit javax.print Allgemeine Java-Themen 2
Z Problem beim Aufruf eines Listener? Allgemeine Java-Themen 4
bernd Problem beim kopieren! Allgemeine Java-Themen 2
B problem beim erstellen einer ausführbaren jar-datei Allgemeine Java-Themen 5
A Problem beim Aufruf von javac Allgemeine Java-Themen 7
J JFrame Problem beim schließen Allgemeine Java-Themen 2
S Problem beim Zugriff auf Internetseiten Allgemeine Java-Themen 4
R Problem beim speichern von eigenem objekt Allgemeine Java-Themen 6
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben