Aus endlosschleife kommen

Status
Nicht offen für weitere Antworten.

Jüngling

Mitglied
hay
ich hab ein problem in folgenden applet:
Java:
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 20.05.2009
  * Autor: Marius Obert
  */

public class ball extends Applet implements ActionListener{

  private int diameter1=200;               //durchmesser(diameter)1
  private int diameter2=50;                //durchmesser(diameter)2
  private int xP=100;                      //x.Koordinate
  private int yP=100;                      //y-Koordinate
  private int xChange=4,yChange=3;         // richtungs werte
  private int speed=50;                    //Drehgeschw.
  private Button btnDreh, btnStop;         //Buttons zum Drehen, Stoppen
  private TextField tfSpeed;               //Textfeld zur eingabe der drehgeschw.
  private boolean activ=false;             //Ob es sich drehen soll oder nicht
  private int anfStr=0;                    //zur Gradeingabe der Strahlen

  public void init() {
  
  btnDreh= new Button("Drehe!");           //Aktivierung Button Drehe
  add(btnDreh);
  btnDreh.addActionListener(this);

  btnStop= new Button("Stop!");            //Aktivierung Button Stop
  add(btnStop);
  btnStop.addActionListener(this);
  
  tfSpeed= new TextField(10);              //Aktivierung Textfeld Speed
  add(tfSpeed);
  tfSpeed.addActionListener(this);
  }
  
  public void actionPerformed(ActionEvent event){
    if(event.getSource()==btnDreh){             //Falls btnDreh, dann activ=true
      activ=true;
    }
    else if(event.getSource()==btnStop){       //Falls btnStop, dann activ=false
      activ=false;
    }
    else{
      speed=Integer.parseInt(tfSpeed.getText());   //Falls TfSpeed, dann speed=eingabe
    }

    repaint();                                       //erneuern
  }
  
  public void aussen(){                                 //zeichne äußeren kreis
    Graphics g=getGraphics();
    g.setColor(Color.red);
    g.drawOval(xP-1,yP-1,diameter1+2,diameter1+2);
  }

  public void loeaussen(){                                 //lösche äußeren kreis
    Graphics g=getGraphics();
    g.setColor(Color.white);
    g.drawOval(xP-1,yP-1,diameter1+2,diameter1+2);
  }

  public void innen(){                                     //zeichne inneren kreis
    Graphics g=getGraphics();
    g.setColor(Color.blue);
    g.fillOval(xP+diameter1/2-diameter2/2,yP+diameter1/2-diameter2/2,diameter2,diameter2);
  }
  
  public void loeinnen(){                                   //lösche inneren Kreis
    Graphics g=getGraphics();
    g.setColor(Color.white);
    g.fillOval(xP+diameter1/2-diameter2/2,yP+diameter1/2-diameter2/2,diameter2,diameter2);
  }
  
  public void striche(){                               //zeichne Strahlen
    for(int i=0;i<=10;i++){
      Graphics g=getGraphics();
      innen();                                        //zeichne erneut inneren kreis damit Strahlen ihn nicht überdecken
      g.setColor(Color.yellow);
      g.fillArc(xP,yP,diameter1,diameter1,anfStr+36*i,-5);
      innen();                                        //zeichne erneut inneren kreis damit Strahlen ihn nicht überdecken
    }
  }

  public void loestriche(){                        //lösche Strahlen
    for(int i=0;i<=10;i++){
      Graphics g=getGraphics();
      innen();                                     //zeichne erneut inneren kreis damit Strahlen ihn nicht überdecken
      g.setColor(Color.white);
      g.fillArc(xP,yP,diameter1,diameter1,anfStr+36*i,-5);
      innen();                                    //zeichne erneut inneren kreis damit Strahlen ihn nicht überdecken
    }
  }

  public void warten(int ms){                    //wartezeit
    try{
      Thread.sleep(ms);
    }
    catch(InterruptedException e){ }
  }

  
  public void paint(Graphics g){            //eigentlicher Vorgang

       aussen();
       striche();

       while(activ==true){

       aussen();
       striche();
       warten(speed);
       loestriche();
       anfStr=anfStr+5;
       loeaussen();
       loeinnen();
       if(xP<=0) xChange=-xChange;
       else if(xP>=getSize().width-diameter1) xChange=-xChange;
       else if(yP<=30) yChange=-yChange;
       else if(yP>=getSize().height-diameter1) yChange=-yChange;
       xP=xP+xChange;
       yP=yP+yChange;



       }

  }
}

mein prob ist das ich nicht mehr aus der endlosschleife rauskomme.....
den mechanismus habe ich ja eig. mit dem Stop-Button geplant. Aber während der schleife überprüft es nicht ob der button gedrückt wurde......kann man i-wie ActionPerformed merhfach aufrufen
 
S

SlaterB

Gast
niemals getGraphics(); aufrufen,
in paint() hast du das Graphics-Objekt, das kannst du als Parameter an andere Methoden verteilen

kein Schleife in paint(), solange die läuft, kommt kein ActionListener zum Zuge,
lasse separat einen Thread laufen, der alle 30 ms repaint() aufruft
 

Schandro

Top Contributor
1. Du darfst NIEMALS in einer paint Methode was andere als malen machen, schon garnicht ne Unendlichschleife oder Thread.sleep.

2. Du darfst NIEMALS getGraphics(); aufrufen.


Hier mal ein Beispielcode:
Java:
package snippetbin;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class XXX{

    public static void main(String[] args){
        new XXX();}


    private JFrame window;
    private JPanel panel;
    private int cnt; // wird zur Kommunikation ziwschen dem animationThread und paintComponent benutzt
    private javax.swing.Timer paintTimer;
    
    public XXX(){
    	window = new JFrame();
        window.setBounds(100,100,400,200);
        
        panel = new JPanel();
        window.add(panel);
        
        
        panel.setLayout(new BorderLayout());
        
        JButton button = new JButton("Stop/Start");
        button.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				if(paintTimer.isRunning()){
					paintTimer.stop();
				}
				else{
					paintTimer.start();
				}
        
			}
        });
        panel.add(button,BorderLayout.NORTH);
      
        panel.add(paintPanel);

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                window.setVisible(true);
            }
        });


        paintTimer = new javax.swing.Timer(10,new ActionListener(){
			public void actionPerformed(ActionEvent event){
				++cnt;
				paintPanel.repaint();
			}
		});
        
        paintTimer.start();
        
    }


    private JPanel paintPanel = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);

            g.setColor(Color.BLACK);
            g.fillRect(cnt,50,50,50);

            paintThings(g);
        }
    };

    private void paintThings(Graphics g){ // anstatt hier getGraphics() aufzurufen kannst du dir auch einfach das Graphics-Object als Parameter mitgeben lassen. Wichtig: Diese Methode darf und kann nur von der paintComponent-Methode aus aufgerufen werden!
    	g.drawLine(0,45,1000,45);
    	g.drawLine(0,105,1000,105);
    }

}
 
Zuletzt bearbeitet:

Jüngling

Mitglied
wieso darf man getGraphics(); nicht aufrufen? unser IT lehrer hat uns so dieses applet gezeigt.....repaint() kenne ich zwar aber dann flimmert es doch?

danke für deinen verbesserungsvorschlag schandro...jedoch kenne ich die hälfte der import klassen nichteinmal geschweige den kann ich sie benutzen....
 

Paddelpirat

Bekanntes Mitglied
Um das flimmern weg zu bekommen solltest du mal nach dem Stichwort "DoubleBuffered" suchen. Ich habe es mal auf die schnelle folgendermaßen implementiert, wobei es sicherlich noch besser geht:

Java:
public void paint(Graphics g){            //eigentlicher Vorgang
	  paintDoubleBuffered(g);
  }
  
  public void paintDoubleBuffered(Graphics g) {
	  paintDirect(g);
	  malen(g);
  }
  
  public void paintDirect(Graphics g) {
	  g.setColor(Color.white);
	  g.fillRect(xP-10, yP-10, diameter1+36, diameter1+36); //Löschen des alten Rades
	  malen(g);
  }
  
  private void malen(Graphics h) {
	  Graphics g = getGraphics();
	  aussen(g);
      striche(g);
      
      aussen(g);
      striche(g);
      anfStr=anfStr+5;
      if(second) { //Die position wird nur bei jedem zweiten Zeichnen verändert, siehe DoubleBuffered.
    	  if(xP<=0) xChange=-xChange;
    	  else if(xP>=getSize().width-diameter1) xChange=-xChange;
    	  else if(yP<=30) yChange=-yChange;
    	  else if(yP>=getSize().height-diameter1) yChange=-yChange;
    	  
    	  xP=xP+xChange;
    	  yP=yP+yChange;
      }
      second = !second; //Boolean der angibt, ob es sich um das erste oder zweite Bild handelt.
  }

Die ganzen Lösch-Methoden habe ich mal aus Performance-Gründen durch das Zeichnen eines einfachen weißen Rechtecks ersetzt.
 

Jüngling

Mitglied
also danke für eure antworten ich habe es jetzt mit repaint() und ohne filmmern hinbekommen.....sogar meine lehrer waren beeindruckt dass es ohne einen thread geht;)

ganz großes DANKE!!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
noah1407 endlosschleife Java Basics - Anfänger-Themen 7
G Endlosschleife keine Rückgabe Java Basics - Anfänger-Themen 36
sserio Endlosschleife ja nein? Java Basics - Anfänger-Themen 13
javapingu Endlosschleife bei User Input mit try Scanner Java Basics - Anfänger-Themen 7
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
O Endlosschleife abbrechen Java Basics - Anfänger-Themen 10
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
S Interpreter-Fehler Endlosschleife zur Laufzeit aber warum? Java Basics - Anfänger-Themen 15
T Erste Schritte Endlosschleife & wozu braucht man /* und */ Java Basics - Anfänger-Themen 19
J Endlosschleife bei Try-Catch? Java Basics - Anfänger-Themen 3
S Endlosschleife - Warum? Java Basics - Anfänger-Themen 1
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
C Collatzfolge endlosschleife. Java Basics - Anfänger-Themen 4
D Array in Endlosschleife überschreibt vorherige Werte Java Basics - Anfänger-Themen 4
E Eulersche Zahl berechnen, Endlosschleife Java Basics - Anfänger-Themen 2
N Endlosschleife... Warum? Java Basics - Anfänger-Themen 12
P Kapselung Problem - Endlosschleife Java Basics - Anfänger-Themen 10
M Endlosschleife bricht durch switch ab Java Basics - Anfänger-Themen 17
D Endlosschleife und ich komme nicht raus! Java Basics - Anfänger-Themen 8
N Erste Schritte Endlosschleife und Exception Java Basics - Anfänger-Themen 5
R Endlosschleife nach InputMismatchException Java Basics - Anfänger-Themen 2
S Endlosschleife? Java Basics - Anfänger-Themen 2
T Endlosschleife Java Basics - Anfänger-Themen 2
Z Endlosschleife Java Basics - Anfänger-Themen 6
T Endlosschleife Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
StupidAttack Endlosschleife, Sockets Java Basics - Anfänger-Themen 2
C ungewollte Abbrüche in einer Endlosschleife Java Basics - Anfänger-Themen 6
E komische endlosschleife Java Basics - Anfänger-Themen 6
7 Endlosschleife pausieren Java Basics - Anfänger-Themen 11
F .readLine() erzeugt endlosschleife Java Basics - Anfänger-Themen 4
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
F Falscheingabe abfangen - Endlosschleife Java Basics - Anfänger-Themen 5
R warum endlosschleife? Java Basics - Anfänger-Themen 7
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
S JTable Endlosschleife Java Basics - Anfänger-Themen 5
R Endlosschleife verhindert das Schließen des Fensters Java Basics - Anfänger-Themen 10
Povlsen84 Endlosschleife Java Basics - Anfänger-Themen 5
V Bubble Sort endet in Endlosschleife Java Basics - Anfänger-Themen 4
Antoras Endlosschleife Java Basics - Anfänger-Themen 8
J Wartezustand in Endlosschleife - bessere Alternativen Java Basics - Anfänger-Themen 20
H Problem beim Einlesen einer Datei (Endlosschleife ?) Java Basics - Anfänger-Themen 3
N Endlosschleife? Java Basics - Anfänger-Themen 3
V mehrere Threads starten + Endlosschleife Java Basics - Anfänger-Themen 3
I Hilfe wer findet mein Fehler in bei der Endlosschleife Java Basics - Anfänger-Themen 7
G Sound/Endlosschleife/Abbruchproblem Java Basics - Anfänger-Themen 3
G HappyNumbers - Endlosschleife Java Basics - Anfänger-Themen 11
0 Endlosschleife beim Integer Array mischen? Java Basics - Anfänger-Themen 3
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
G Endlosschleife, aber warum? Java Basics - Anfänger-Themen 12
G Endlosschleife beenden Java Basics - Anfänger-Themen 10
M Wie kommen diese Ausgaben zustande? Java Basics - Anfänger-Themen 12
G Welche Attribute kommen in den Konstruktor? Java Basics - Anfänger-Themen 5
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
G Erste Schritte BinarySearchTree - Wo kommen die Werte her? Java Basics - Anfänger-Themen 5
N Beim hochrechnen kommen garkeine/zuhohe zahlen raus Java Basics - Anfänger-Themen 6
E Senden von Objects an Client. Variablenwerte kommen nicht an Java Basics - Anfänger-Themen 5
A Beim txt Datei einlesen kommen zusätzliche Lehrzeichen dazu. Java Basics - Anfänger-Themen 5
M KeyEvents kommen nicht an Java Basics - Anfänger-Themen 16
T Von Millisekunden auf Stunden kommen Java Basics - Anfänger-Themen 2
G methodenvorschläge bei Punktnotation kommen nicht mehr !! (Eclipse) Java Basics - Anfänger-Themen 5
K Befehl um am Anfang einer Methode zu kommen? Java Basics - Anfänger-Themen 9
R supermario problem (kommen nur zahlen raus) Java Basics - Anfänger-Themen 18
M Schreiben in eine Textdatei Daten kommen aus JTable Java Basics - Anfänger-Themen 2
F Wie kommen die Applets zum Client? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben