# BlueJ Frage



## Hubschaubbäär (9. Feb 2009)

Hallo,

wir programmieren gerade in der Schule mit Java 

und ich hätt mal ne frage:

Kann man mehrer Befehle Gleichzeitig ablaufen lassen?

also z.B. 2 Rechtecke gleichzeitig verschieben


mfg

 hubi


----------



## Developer_X (9. Feb 2009)

ja klar
du hubi


----------



## Hubschaubbäär (9. Feb 2009)

weis du auch wie des geht ^^


----------



## Developer_X (9. Feb 2009)

```
public class duHubi extends Frame
{
public static void main(String[]args)
{
duHubi duhubi = new duHubi();
duhubi.setTile("duHUBI!!!");
duhubi.setVisible(true);
}
public void paint(Graphics g)
{

//.. was du machen möchtest du hubi!
warte(1000);
//..was soll nach einer sekunde passiert sein
}
public static void warte(long millis){
	try{
		Thread.sleep(millis);
	}
	catch(InterruptedException e){}
}
}
```


----------



## Schandro (9. Feb 2009)

oh man developer_x, echt tolle Antwort...  EDIT: Meinte den ersten Post von dir, du Developer

@Hubschaubbäär
Leider seehr ungenau gestellt die Frage.
Meinst du sowas? :

```
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class XXX{

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


	private JFrame window = new JFrame();
	int x;
	int x2;

	public XXX(){
		window.setBounds(100,100,400,400);

		window.add(panel);

		window.setVisible(true);

		new Thread(new Runnable(){
			public void run(){
				while(true){
					try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}
					x+=5;
					x2+=10;
					panel.repaint();
				}
			}
		}).start();
	}


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

			g.drawRect(x,10,50,50);
			g.drawRect(x2,50,50,50);


		}
	};

}
```

EDIT: Das Beispiel von Developer_X ist übrigens Schrott. man sollte niemals irgendwas anderes außer das malen in paint machen, schon garnicht Thread.sleep();


----------



## Developer_X (9. Feb 2009)

alles klar du hubi?
PS:
Ich benutzte nur hubi, weil du als erstes als letztes geschrieben hast ich zitiere mal:
mfg 

hubi


----------



## Hubschaubbäär (9. Feb 2009)

bei mir schauts grad so aus



```
public void Tag()
    {
      Sonne.Sonne (75);

      Rauch.Rauch (75);
      
     .
     .
     .
```


und ich will, dass der befehl sonne gleichzeitig mit dem befehl rauch ausgeführt werden

sodass sich beide kreise gleichzeitig bewegen


----------



## Schandro (9. Feb 2009)

poste mal bitte kompletten Code. Das einzige was man dir zu dem Code sagen kann, den du geschrieben hast, ist:
Methodennamen werden Kleingeschrieben...


----------



## Hubschaubbäär (9. Feb 2009)

```
public class Haus
{
    // instance variables - replace the example below with your own
        Rechteck3 Nacht;
    Rechteck Bau;
    Dreieck Dach;
    Rechteck2 Kamin;
    Sonne Sonne;
    Quadrat Fenster1;
    Quadrat Fenster2;
    Quadrat Fenster3;
    Quadrat Fenster4;
    Gras Gras;
    Rauch Rauch;


    public Haus()
    {
        // initialise instance variables
       Nacht = new Rechteck3(); 
       Rauch = new Rauch();
       Fenster1 = new Quadrat();
       Fenster2 = new Quadrat();
       Fenster3 = new Quadrat();
       Fenster4 = new Quadrat();
       Gras = new Gras(); 
       Bau = new Rechteck();
       Dach = new Dreieck();
       Kamin = new Rechteck2();
       Sonne = new Sonne();
      Gras.sichtbarMachen (); 
      Bau.sichtbarMachen ();
      Dach.sichtbarMachen ();
      Kamin.sichtbarMachen ();
      Fenster1.sichtbarMachen ();
      Fenster2.sichtbarMachen ();
      Fenster3.sichtbarMachen ();
      Fenster4.sichtbarMachen ();
      Fenster1.vertikalBewegen(190);
      Fenster2.vertikalBewegen(190);
      Fenster3.vertikalBewegen(160);
      Fenster4.vertikalBewegen(160);
      Fenster1.horizontalBewegen(50);
      Fenster2.horizontalBewegen(70);
      Fenster3.horizontalBewegen(50);
      Fenster4.horizontalBewegen(70);

      
    }
    
    public void Tag()
    {



       //die beiden sollen gleichzeitig ausgeführt werden//
      ________________
      Sonne.Sonne (75);
      Rauch.Rauch (75);
      _______________
      Rauch.Rauch (75);
      Rauch.Rauch (75);
      Rauch.Rauch (75);
      Rauch.Rauch (75);
      Rauch.Rauch (75);
      Rauch.Rauch (75);
      Rauch.Rauch (75); 
      Rauch.unsichtbarMachen();
      Sonne.nachLinksBewegen();
      Nacht.sichtbarMachen();
      Gras.sichtbarMachen (); 
      Bau.sichtbarMachen ();
      Bau.farbeAendern ("grau");
      Dach.sichtbarMachen ();
      Kamin.sichtbarMachen ();
      Fenster1.sichtbarMachen ();
      Fenster2.sichtbarMachen ();
      Fenster3.sichtbarMachen ();
      Fenster4.sichtbarMachen ();
      Sonne.Mond(75);
      Bau.farbeAendern ("weiss");
      Nacht.unsichtbarMachen();
      Fenster1.sichtbarMachen ();
      Fenster2.sichtbarMachen ();
      Fenster3.sichtbarMachen ();
      Fenster4.sichtbarMachen ();
    }
     

     
   
}
```


----------



## Schandro (9. Feb 2009)

Reicht leider immernoch nicht 

Ich nehm jetzt mal an, das Dreieck, Kamin usw. von JComponent erben und sachen wie "horizontalBewegen(50)" einfach nur:
this.setLocation((int)this.getLocation().getX()+param,(int)this.getLocation().getY());
aufruft.

Dann funktioniert gleichzeitiges bewegen:

```
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;

public class XXX{

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


	private JFrame window = new JFrame();
	private JPanel panel = new JPanel();

	public XXX(){
		window.setBounds(100,100,400,400);

		window.add(panel);
		window.setVisible(true);

		panel.setLayout(null); // sollte man eigentlich fast nie machen, ist hier ne Ausnhame

		final JButton button = new JButton("Hallo");
		button.setSize(80,50);
		panel.add(button);
		final JButton button2 = new JButton("Zweites Hallo");
		button2.setSize(150,20);
		panel.add(button2);

		new Thread(new Runnable(){
			public void run(){
				while(true){
					try{Thread.sleep(100);}catch(Exception e){e.printStackTrace();}
					button.setLocation((int)button.getLocation().getX()+1,(int)button.getLocation().getY());
					button2.setLocation((int)button2.getLocation().getX()+3,(int)button2.getLocation().getY());
				}
			}
		}).start();
	}
}
```

Wahrscheinlich haben deine öminösen großgeschrieben Methoden wie "Rauch" aber eine andere art, wie sie sich malen. Kannst du auf diesen Code zugreifen?

Edit: Was du aufjedenfall ausprobieren könntest:



```
new Thread(new Runnable(){
	public void run(){
	   Sonne.Sonne (75); 
	}
}).start();
new Thread(new Runnable(){
	public void run(){
	   Rauch.Rauch (75); 
	}
}).start();
```


----------



## Developer_X (9. Feb 2009)

ach ihr seid aber auch hubis


----------



## Schandro (9. Feb 2009)

Ich hätt auch noch nen Vorschlag für den admin von java-forum.org, du wolltest dem doch eh ne email schreiben:
Man bräuchte hier eine ignore Liste, wo Postings von bestimmten Accounts automatisch ausgeblendet werden.

PS: Wär gut wenn du den Code von dir ganz oben in diesen Thread wegmachen würdest, andere Sachen innerhalb der paint-Methode sind nämlich extrem schlecht und haben mich selber schon mind. 20 Stunden Zeit gekostet, bis ich das damals gerafft habe. Wär also nicht so schön, wenn jemand deinen Post als Vorbild nimmt und das nachprogrammiert


----------



## Hubschaubbäär (10. Feb 2009)

das is genau das was ich machen wollte (also der edit)

wenn ich des dann aber aufführen will kommt eine fehlermeldung



java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at Leinwand.erneutZeichnen(Leinwand.java:132)
	at Leinwand.zeichne(Leinwand.java:85)
	at Sonne.zeichnen(Sonne.java:509)
	at Sonne.Sonne(Sonne.java:252)
	at Haus$1.run(Haus.java:60)
	at java.lang.Thread.run(Thread.java:619)


und der Quelltext von meiner leinwand öffnet sich  :?:


----------



## Steev (12. Feb 2009)

Dieser Fehler kommte vorrangig, wenn du keine Elemente in einer Liste hast und dann folgendes machst:


```
for(Element e : elements)
{
  // do something
}
```

Ansonsten verstehe ich ehrlich gesagt überhaupt nicht wo hier das Problem ist. Du willst glaube ich ein Haus zeichnen, wo aus dem Schornstein Rauch heraus kommt?

Benutze einfach Rectangle-, Oval- oder GeneralPath-Objekte, mit denen du die Formen darstellst. Dann musst du einfach nur pro Neuzeichnung durch deine repaint-Schleife die Objekte verschieben. 

Zeitmäßig werden deine Objekte natürlich hintereinander verschoben, aber da alles auf einmal gezeichnet wird, schaut es dann so aus, als ob sich alle Objekte gleichzeitig bewegen.

PS: Falls du mehrere Threads verwendest würde ich die Bewegungen synchronisieren, damit die Bewegungen auch wirklich immer gleich ablaufen.


----------

