Thread

SirWayne

Erfahrenes Mitglied
Also ich habe folgendes Problem : Beschreibung: Ich habe ein JApplet mit ein paar Buttons auf denn Buttons sind ActionListener regestriert welche abfragen was für ein button gedrückt wurden.und am schluß repaint aufrufen und einen String pfeil auf einen wert setzen.Funktioniert alles wunderbarDoch in meinem paint(SIEHE UNTEN Teil-CODE) will ich was zeichnen lassen(Strichmännchen) dann WILL ICH EINE PAUSE und dann nochmal was zeichnen lassen...DAS PROBLEM IST ER MACHT ERST NE PAUSE(nach button druck) und dann zeichnet er beides gleichzeitig!!WARUM Wenn das jemand versteht oder mit helfen könnet wäre ich euch voll dankbar ...Ich hoffe ich hab mein problem einigermaßen verständlich beschrieben ;-p


PHP:
paintComponent(Graphics g)
{
super.paintComponent(g);
 if(pfeil=="r")
       {
         g.drawString ("O",200+count,150);
         g.drawString ("*",212+count,165);
         g.drawString ("*",192+count,165);
         g.drawLine(204+count,150,204+count,165);
         g.drawLine(204+count,158,197+count,158);
         g.drawLine(204+count,158,211+count,158);
         g.drawLine(204+count,165,209+count,180);
         g.drawLine(204+count,165,202+count,180);
         
         try
        {
         Thread.sleep(500L);
        }
         catch(Exception e)
        {

        }

          g.drawLine(200,200,100,100);

       }
 
Hallo,

eine Komponente zeichnet erst dann wenn die paint Methode vollständig ausgeführt ist. Deswegen wartet sie auch bis alles fertig ist und zeichnet erst dann. Den Thread musst du außerhalb einbauen.

Hier ein Beispiel:

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class LineManApplet extends JApplet {

	int position = 50;

	int status = 0;

	boolean stop = true;

	JButton b1 = new JButton("Zeichne");

	JButton b2 = new JButton("Stop");

	JButton b3 = new JButton("Lösche");

	JLabel l1 = new JLabel("Status: " + status, JLabel.TRAILING);

	JPanel buttonPan = new JPanel();

	public void init() {
		buttonPan.setLayout(new GridLayout(1, 4));
		buttonPan.add(b1);
		buttonPan.add(b2);
		buttonPan.add(b3);
		buttonPan.add(l1);

		this.add(buttonPan, BorderLayout.NORTH);

		this.setVisible(true);
	}

	public void start() {
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop = false;
				new Thread() {
					public void run() {
						for (int i = status; i < 8; i++) {
							if (stop == true)
								break;
							status++;
							l1.setText("Status: " + status);
							repaint();
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
						}
					}
				}.start();
			}
		});

		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop = true;
				l1.setText("Status: " + status);
			}
		});

		b3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				status = 0;
				Graphics g = LineManApplet.this.getGraphics();
				g.setColor(new Color(238,238,238));
				g.fillRect(0, b1.getHeight(),
						LineManApplet.this.getWidth(), LineManApplet.this.getHeight());
				l1.setText("Status: " + status);
			}
		});
	}

	public void paint(Graphics g) {
		if (status == 0)
			return;
		g.drawString("O", 200 + position, 150);
		if (status == 1)
			return;
		g.drawString("*", 212 + position, 165);
		if (status == 2)
			return;
		g.drawString("*", 192 + position, 165);
		if (status == 3)
			return;
		g.drawLine(204 + position, 150, 204 + position, 165);
		if (status == 4)
			return;
		g.drawLine(204 + position, 158, 197 + position, 158);
		if (status == 5)
			return;
		g.drawLine(204 + position, 158, 211 + position, 158);
		if (status == 6)
			return;
		g.drawLine(204 + position, 165, 209 + position, 180);
		if (status == 7)
			return;
		g.drawLine(204 + position, 165, 202 + position, 180);
	}
}


Vg Erdal
 
mhhhh ja so kenn ich das auch...aber das ist nicht mein Problem ich habe ein Strichmänchen
O so ungefähr jetzt hab ich den Button nach "rechts" laufen.
\|/
/\

Also will ich das sich beide Arme und ein Bein ändert(Position),so dass es aussieht wie wenn er laufen würde,das klappt auch so jetzt will ich das er 100Millisec wartet und eine zweite Bewegung macht(ohne Buttondruck) darum der Thread in dem if.....also die Figur bewegt sich 2mal mit dem einen buttondruck und zwischen den Bewegungen soll er 100 Millisec warten aber das macht er nicht und des versteh ich nicht.....
 
Zuletzt bearbeitet:
Wie schon gesagt, darfst du kein Thread in die paint Methode einbauen. Die paintMethode muss zuerst vollständig bearbeitet werden, und dann wird erst gezeichnet. Ich hoffe das war verständlich genug. D.h. dein Thread muss außerhalb liegen. Ich habe das doch so ähnlich implementiert, wie du das haben möchtest. Du drückst auf einen Button einmal. Das Männchen wird Stück für Stück gezeichnet, und dabei jeweils gewartet. Du könntest jetzt mein Beispiel derart ändern das es nach rechts und links läuft. Nämlich in dem du, nicht status hochzählst, sondern für rechts count hochzählst und links count runterzählst und die ganzen if Bedingungen für status entfernst.

Vg Erdal
 
also ich hab des mit den buttons jetzt gelassen weil es zu umständlich ist und es mit einem KeyListener gemacht da es nach deiner Methode funktioniert...aber mit dem thread momm ich ehrlich gesagt nicht so richtig zu recht...ich hab versucht es mit deinem Bespiel zu machen aber es will nicht richtig funktionieren schau dir doch mal bitte den Code an
Code:
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class Leader extends JApplet
{

  String pfeil;
  int count;
  boolean b=true;
  int status=0;
  Thread t;
  MyRun r=new MyRun();





  public void init()
  {
   this.addKeyListener(new MyKeyListener());
   add(new MyPanel());

  }


  // innere Klasse zum malen (Center)
  class MyPanel extends JPanel
  {

    public MyPanel()
    {
     setBackground(Color.WHITE);
    }


   public void paintComponent(Graphics g)
   {
     super.paintComponent(g);
     g.setColor(Color.BLACK);
     g.drawLine(0,180,1000,180);

     if(b)
     {
      standard(g);
      b=false;
     }
     else;


      if(pfeil=="r")
       {
//hier ist mein Problem er soll erst die 1.Figur malen
         if(status==0)
         {
         count=count*5;

         g.drawString ("O",200+count,150);
         g.drawString ("*",212+count,165);
         g.drawString ("*",192+count,165);
         g.drawLine(204+count,150,204+count,165);
         g.drawLine(204+count,158,197+count,158);
         g.drawLine(204+count,158,211+count,158);
         g.drawLine(204+count,165,209+count,180);
         g.drawLine(204+count,165,202+count,180);
         }
//hier soll die pause sein und danach die standard funktion wieder malen um 5 nach 
//rechts verschoben
         else;
         if(status==1)
         {
           count++;
           count=count*5;
           stabdard(g)
         }

       }
      else;
      if(pfeil=="l")
      {
// Hier hab ich noch nichts dran geändert weil es oben schon nicht funktioniert
         g.drawString ("O",200+count,150);
         g.drawString ("*",212+count,165);
         g.drawString ("*",192+count,165);
         g.drawLine(204+count,150,204+count,165);

        g.drawLine(204+count,158,197+count,158);
        g.drawLine(204+count,158,211+count,158);

        g.drawLine(204+count,165,207+count,180);
        g.drawLine(204+count,165,199+count,180);

       }


      else;





   }
   public void standard(Graphics g)
   {

      g.drawString ("O",200+count,150);
      g.drawString ("*",208+count,154);
      g.drawString ("*",195+count,154);

      g.drawLine(204+count,150,204+count,165);
      g.drawLine(204+count,161,199+count,150);
      g.drawLine(204+count,161,209+count,150);
      g.drawLine(204+count,165,209+count,180);
      g.drawLine(204+count,165,199+count,180);
    }
     class MyKeyListener extends KeyAdapter
   {
    public void keyTyped(KeyEvent e)
    {
     if(e.getKeyChar()==KeyEvent.VK_6)
     {
      pfeil="r";
      count=count ++;

     }
     else;

     if(e.getKeyChar()==KeyEvent.VK_4)
     {
      pfeil="l";
      count=count--;
     }
     else;
     t=new Thread(r);
     t.start();

    }
   }
   
   class MyRun implements Runnable
   {
     public void run()
     {
     for(int i=status;i<2;i++)
     {
      repaint();
       if(status==1)
       {
         break;
       }
       else;

       status++;
       try
      {
       Thread.sleep(1000);
      }
      catch(InterruptedException  e)
      {
        return;
      }
      
     }

     }
   }
}

wäre cool wenn du vielleicht den fehler findest ich versuch es solange mal weiter ;-p
 
Hallo,

da ist so einiges falsch. Was mir spontan auffält:

1. Die Klasse JApplet hat keine Methode paintComponent. Du musst da schon paint verwenden.
2. Du vergleichst Strings mit diesem == Operator. Strings vergleicht man derart myString1.equals(myString2); oder "a".equals("b");
3. Du hast viele eigene Klassen implementiert, was bei solchen simplen Dingen unnötig ist. Dann hast du diese ineinander verschachtelt. Dennoch möchtest du Myrun und MyKeylistener in der äußersten Klasse verwenden, diese sind aber nur in der Klasse MyPanel sichtbar.

Vg Erdal
 
ich benutze paintComponent in dem JPanel,weil man des bei Swing so macht ...Soviel ich weiß benutzt man die paint Methode nur bei awt...
So brauch ich kein Double-Buffering.....

Ähm hab glaub ne Klammer vergessen mein KeyListener und MyRun sind in der äußeren Klasse...Na ja ich finde es irgendwie übersichtlicher

3. ich versteh imme rnoch nicht warum er keine pause macht
4. des mit den String ist mir schon klar!Doch hat es mit dem equals nicht geklappt da hab ich es so probiert und ist gegangen... Hatte das Problem schon einmal ,es gibt Ausnahmen da klappt das mit dem equals nicht...hat mir mal jemand gesagt wann ich weiß es aber nicht mehr....Weil der Compiler den String nicht immer als objekt ansieht....
 
Zuletzt bearbeitet:
Hallo,

Das Thread.sleep() darf nicht in paintComponent sein. Die Zeilen in paintComponent werden von Anfang bis Ende abgearbeitet und erst dann wird das Resultat gezeichnet.

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;

public class LineManApplet2 extends JApplet {
	
	int position = 50;

	boolean stop = true;
	
	boolean move = false;
	
	char direction = ' ';

	JButton b1 = new JButton("Nach rechts ->");

	JButton b2 = new JButton("Nach links <-");
	
	JButton b3 = new JButton ("Stop");

	JButton b4 = new JButton("Lösche");

	JPanel buttonPan = new JPanel();

	public void init() {
		buttonPan.setLayout(new GridLayout(1, 4));
		buttonPan.add(b1);
		buttonPan.add(b2);
		buttonPan.add(b3);
		buttonPan.add(b4);

		this.add(buttonPan, BorderLayout.NORTH);
		
		this.setVisible(true);
	}

	public void start() {
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop = false;
				direction = 'r';
				if (!move) move();
			}
		});
		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop = false;
				direction = 'l';
				if (!move) move();
			}
		});
		b3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				stop = true;
			}
		});
		b4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				clear();
			}
		});
	}
	
	public void move(){
		new Thread() {
			public void run() {
				move = true;
				
				while(!stop){
					if (direction == 'r')
						position = position + 5;
					else position = position - 5; 
					clear();
					repaint();
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				move = false;
			}
		}.start();
	}

	public void paint(Graphics g) {
		g.drawString("O", 200 + position, 150);
		g.drawString("*", 212 + position, 165);
		g.drawString("*", 192 + position, 165);
		g.drawLine(204 + position, 150, 204 + position, 165);
		g.drawLine(204 + position, 158, 197 + position, 158);
		g.drawLine(204 + position, 158, 211 + position, 158);
		g.drawLine(204 + position, 165, 209 + position, 180);
		g.drawLine(204 + position, 165, 202 + position, 180);
	}
	
	public void clear(){
		Graphics g = LineManApplet.this.getGraphics();
		g.setColor(new Color(238,238,238));
		g.fillRect(0, b1.getHeight(),
				LineManApplet2.this.getWidth(), LineManApplet2.this.getHeight());
	}
}

Vg Erdal
 
Zuletzt bearbeitet:
Zurück