# Kugel diagonal laufen lassen



## Cosma (26. Okt 2011)

Hallo,
ich schreibe gerade an einem Programm, dass eine Kugel von der oberen linken Ecke in die untere Laufen lässt.
Ich habe 4 Buttons, einer startet es, einer stoppt es, einer macht es schneller und einer langsamer.

Mein Problem ist, auch wenn ich vielleicht nur komplett auf der Leitung stehe, welche Koordinaten es sind, wenn die Kugel in der oberen linken Ecke ist?

Habt ihr Ansätze für mich?


----------



## SlaterB (26. Okt 2011)

du kannst schon an bestimmten Koordinaten malen, und weißt jetzt nur nicht wo du starten sollst?
ausprobieren verschiedener Werte?

wenn ich mir das vorherige Thema
http://www.java-forum.org/hausaufgaben/125867-grafik-zufaellig-text-zufaellig-erstellen.html
anschaue, dann müsstest du doch schon ein gutes Gefühl für Koordinaten haben

oder geht es dir um Rechnung, Ausdehnung der Kugel berücksichtigen?


----------



## Cosma (26. Okt 2011)

Es läuft schon mal nicht, weil es nicht startet...
jetzt versuch ich es halt 'blind zu machen'.
ich weiß einfach nicht, wie ich sie zum starten in der Ecke bringe...


```
public class Kugel extends JFrame implements ActionListener {
    
    JFrame frame1=new JFrame();
    kugelbewegt kugelbewegt1;
    JButton start, stop, schneller, langsamer;
    JPanel panel1;
    
    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Kugel kugel1=new Kugel();
    }
    
    public void erzeugen()
            
    {frame1=new JFrame();
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400,400);
    getContentPane().setLayout(new BorderLayout(500,500));
    start=new JButton("Start!");
    stop=new JButton("Stop!");
    schneller=new JButton("Schneller!");
    langsamer=new JButton("Langsamer!");
    panel1=new JPanel();
    
start.addActionListener(this);            
stop.addActionListener(this);
schneller.addActionListener(this);
langsamer.addActionListener(this);

frame1.getContentPane().add(BorderLayout.EAST, start);
frame1.getContentPane().add(BorderLayout.EAST, stop);
frame1.getContentPane().add(BorderLayout.EAST, schneller);
frame1.getContentPane().add(BorderLayout.EAST, langsamer);


frame1.setVisible(true);
ActionListener al=new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
            }
        };
    ActionListener al1=new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
            }
        };
    ActionListener al2=new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
            }
        };
    ActionListener al3=new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                
            }
        };
 
    
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


  

  
        
        
    }
```


----------



## SlaterB (26. Okt 2011)

du fragst eine Nebenfrage obwohl das ganze Programm noch nicht läuft..,
kopiere doch vorherige Programme um überhaupt erstmal irgendwas zu malen?

panel1 ist nicht in die GUI eingefügt, allerdings gibts auch nirgendwo eine überschriebene paintComponent-Methode,
mehrere Dinge in BorderLayout.EAST usw. einzufügen geht nicht, das muss wenn dann in ein JPanel nur das JPanel dort platzieren

Grundlagen? um die Kugel kannst du dir sehr viel später noch Gedanken machen

edit: erzeugen() wird nie aufgerufen

edit: frame1=new JFrame(); innerhalb eines Objektes, dessen Klasse von JFrame erbt ist nie gut,
das sind zwei JFrames,
entscheide dich für einen Weg, separates Objekt oder Vererbung, hier gerade ein größerer Thread dazu  : 
http://www.java-forum.org/java-basics-anfaenger-themen/126068-lieber-jframe-erben.html


----------



## hdi (26. Okt 2011)

> Es läuft schon mal nicht, weil es nicht startet...


Ja, dann solltest du das erstmal fixen. Wieso startest es nicht? Compile-Error? Runtime-Error? Java schmeißt in der Regel recht aussagekräftige Fehlermeldungen.


----------



## Cosma (26. Okt 2011)

Kann schon sein dass ich 'Grundlagen' nicht kann, weil ich einfach nochmal schlecht bin und nicht weiß wie es komplett funktioniert.



Er schmeißt keine Fehlermeldung, er schreibt dass ers erstellt hat aber er macht nichts auf.


----------



## hdi (26. Okt 2011)

```
public static void main(String[] args) {
        Kugel kugel1=new Kugel();
    }
```

Du rufst den Default-Konstruktor der Klasse auf. Von einem Aufruf von erzeugen() weit und breit keine Spur. Übrigens _ist _Kugel ein JFrame, du brauchst also nicht ein zweites Frame "frame1".


----------



## SlaterB (26. Okt 2011)

siehe auch meine edits im letzten Posting, 
und bitte nicht alles als Kritik auffassen, jedenfalls nicht an deinen Java-Kenntnissen sondern an deinem Vorgehen,
du musst erst ein Fenster zum Laufen bringen, danach kannst du über die Position der Kugel nachdenken,

das sollte eigentlich auch ohne höhere Kenntnisse gedanklich sortiert möglich sein,
wenn ich gleich am Anfang '0,0 ist die Position oben links' geantwortet hätte, wärst du auch nicht wirklich weiter oder?


----------



## Cosma (26. Okt 2011)

Ich bin echt dankbar für die Hilfe nur versteh ich leider die Zusammenhänge nicht, bzw nicht wie ich sie ändern soll. Für mich sind das jetzt viele einzelne Sachen, aber ich kenn mich trotzdem nicht so aus ..


----------



## Cosma (26. Okt 2011)

SlaterB hat gesagt.:


> siehe auch meine edits im letzten Posting,
> und bitte nicht alles als Kritik auffassen, jedenfalls nicht an deinen Java-Kenntnissen sondern an deinem Vorgehen,
> du musst erst ein Fenster zum Laufen bringen, danach kannst du über die Position der Kugel nachdenken,
> 
> ...



Es sollte auch von mir nicht so klingen. Ich war/bin ein bisschen verzweifelt weil ich das auch abgeben muss und ich weiß, dass ich eigentlich schlecht bin aber ich auch einmal etwas zusammenbringen will weil ichs am Anfang noch halbwegs verstanden habe


----------



## SlaterB (26. Okt 2011)

noch einmal wiederholt:
http://www.java-forum.org/hausaufgaben/125867-grafik-zufaellig-text-zufaellig-erstellen.html
handelte von einem Programm welches offensichtlich bei dir funktioniert und irgendwas gemalt hat,
kannst du das nicht kopieren und zusammenkürzen um eine Kugel anzuzeigen?


----------



## hdi (26. Okt 2011)

Also das Programm worum's hier geht ist ja in der Tat gar nicht mal so einfach, da du Threads einsetzen musst (Start/Stop). Du musst das Stück für Stück implementieren. Kuck erstmal, dass du es hinkriegst dein Fenster anzuzeigen, mit der Kugel. Die muss sich noch nicht bewegen, nur damit du mal ein Fenster hast wo du erfolgreich was reinzeichnen kannst. Und wenn du das hast, dann zeig bitte den Code. Denn "funktioniert" != "richtig gemacht".


----------



## GUI-Programmer (26. Okt 2011)

Du solltest dich auf jeden Fall entscheiden, welches deiner beiden Frames du startest! Deine Klasse erbt von JFrame und du erzeugst auch noch eines, wobei bei beiden einige Einstellungen, sowie setVisible(true); am Schluss fehlen. Daher mein Tipp, mach dich doch erstmal mit den Grundkenntnissen von GUIs vertraut.

Zur Sache:
An deiner Stelle würde ich das erzeugte Frame weglassen, die Buttons deinen Panel adden und das Panel zur ContentPane deiner Klasse Kugel machen mit: setContentPane(panel1);. Danach kannst du auch auf deinen Panel in der paintComponent() zeichnen.


----------



## Cosma (26. Okt 2011)

```
public class Kugel implements ActionListener {

   
    JFrame frame1=new JFrame();
    kugelbewegt kugelbewegt1;
    JButton start;
    JButton stop;
    JButton schneller;
    JButton langsamer;
  //Hauptmethode 
    public static void main(String[] args) {
        Kugel test=new Kugel();
       test.los();
        }
//erzeugt Frame
public void los()
{
    //Fensterdeklaration   
    frame1=new JFrame();
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 400);

   /* start=new JButton("Start!");
    stop=new JButton("Stop!");
    schneller=new JButton("Schneller!");
    langsamer=new JButton("Langsamer!");*/
   
  //  frame1.getContentPane().add(BorderLayout.NORTH,neu); 
    
   
    kugelbewegt1=new kugelbewegt();
    frame1.getContentPane().add(BorderLayout.CENTER,kugelbewegt1);
   
   // .addActionListener(this);
   
   
    frame1.setVisible(true);
   
}
```


```
public class kugelbewegt extends JPanel {
  
    
    @Override
public void paintComponent(Graphics g)
{   g.setColor(Color.WHITE);
   g.fillOval(10, 20, 50, 50);
    
    }}
```

Jetzt macht es das Fenster auf und erstellt die Kugel


----------



## hdi (26. Okt 2011)

Okay, gut! Ist zwar nicht perfekt, vorallem die fehlende Formatierung (Nutzt du Eclipse? STRG+Shift+F) und die etwas unsinnig gewählten und dazu noch die Namenskonvention verstoßenden Klassen- und Variablennamen stören mich.. Und natürlich die Sache mit dem EDT, aber das geht jetzt zu weit. Für Anfänger-Code erstmal ok.

Jetzt schau, dass du die Buttons reinkriegst. Du hast für das Frame ein BorderLayout, das Zeichenpanel ist in der Mitte. Du könntest die 4 Buttons jetzt drumrum bauen, wäre am einfachsten. Würd aber etwas doof aussehen. Wenn du sie zB alle nebeneinander haben willst, musst du ein zweites Panel erstellen, die Buttons dort reinadden (zB mit FlowLayout) und dann das gesamte Panel zu deinem ContentPane adden.

@all:
auf die fehlende Zeile in der paintComponent (ihr wisst schon, welche) geh ich mal bewusst nicht ein.. Das soll der TO dann selbst merken


----------



## SlaterB (26. Okt 2011)

zm Thread für Animation später schon genannt:
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html


----------



## GUI-Programmer (26. Okt 2011)

OK, dann noch nen paar Tipps: Klassennamen starten immer mit nen Großbuchstaben und das Frame musst du nicht 2mal instanzieren: 


Cosma hat gesagt.:


> ```
> JFrame frame1=new JFrame();
> ```


new JFrame() sollte wegfallen.
Evtl. kannst du deinen Variablen noch Bezeichern geben (evtl. private).


----------



## Cosma (26. Okt 2011)

Ok, danke mal nur ich brauch es ein bisschen langsamer.

ich habe jetzt mal: panel1.add(start); z.B.: gemacht.

aber ich bin ein bisschen verwirrt, was jetzt wie wo hin gehört.


----------



## hdi (26. Okt 2011)

Das BorderLayout, das dein Frame hat, hat die 5 Positionen CENTER, NORTH, SOUTH, EAST, WEST. Deswegen sagte ich dass du die 4 Buttons jeweils an die Seiten hängen kannst, und in der Mitte dein Zeichenpanel. Nur ist das vllt etwas benutzerunfreundlich - schöner wäre es wenn alle Buttons nebeneinander sind. Allerdings hast du dafür keine direkte Option, da es nun mal nur diese 5 Positionen im BorderLayout gibt.

Aber: Man kann Komponenten und Layouts schachteln. D.h. du kannst ein neues Panel machen, wo du das FlowLAyout nimmst. Dieses Layout addet alle Komponenten nebeneinander:


```
JPanel buttons = new JPanel();
buttons.add(btn1);
buttons.add(btn2);
// ...
```

Und am Ende packst du dieses gesamte Panel in dein BorderLayout:


```
getContentPane().add(buttons, BorderLayout.SOUTH);
```


----------



## SlaterB (26. Okt 2011)

@Cosma
du darst auch mehr als 10 Min. nachdenken und zwischen all deinen kurzen Posts mal ausführlich schreiben was exakt an welcher Stelle auf welche Weise dich verwirrt,
lege ausführlich dir denkbare Möglichkeiten, Anzeigeergebnisse und sonstige relevante Details dar

für andere ist nicht nachvollziebar inwiefern dich was auf welche Weise verwirrt, 
"ein Ding kommt per add() in ein JPanel" nix verwirrendes dabei oder was genau?
geht es dir um bestimmte Layouts wie BorderLayout.West usw.?
kann man auch nachlesen aber zumindest in vielen vielen Zeilen in 45 Min. formuliert ausführlich beschreiben 

alle Postings 'ich bin verwirrt' besagen eigentlich nur 'schreibt ihr mal für mich den Code'..

edit: aber ich sehe schon, in diesem Fall wirds fruchtlos, hdi erklärt alles


----------



## hdi (26. Okt 2011)

> edit: aber ich sehe schon, in diesem Fall wirds fruchtlos, hdi erklärt alles


Naja, ein so blutiger Anfänger hat keine Ahnung wonach er genau fragen soll. Wie sollte er auf die Idee kommen nach irgendwelchen Layouts zu fragen, wenn er gar nicht weiß was er da eigentlich genau tut. Er kann nur Fragen nach dem Schema "Wie krieg ich hin, dass..." stellen. Das ist doch eigentlich recht normal am Anfang, und da muss man halt einfach konkret werden.


----------



## Cosma (26. Okt 2011)

```
public class Kugel implements ActionListener {

   
    JFrame frame1=new JFrame();
    kugelbewegt kugelbewegt1;
    JButton start;
    JButton stop;
    JButton schneller;
    JButton langsamer;
    JPanel panel1;
  //Hauptmethode 
    public static void main(String[] args) {
        Kugel test=new Kugel();
       test.los();
        }
//erzeugt Frame
public void los()
{
    //Fensterdeklaration   
    frame1=new JFrame();
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 400);

        start=new JButton("Start!");
    stop=new JButton("Stop!");
    schneller=new JButton("Schneller!");
    langsamer=new JButton("Langsamer!");
    
    
    
    JPanel buttons=new JPanel();
    buttons.add(start);
    buttons.add(stop);
    buttons.add(schneller);
    buttons.add(langsamer);
    
  getContentPane().add(buttons,BorderLayout.EAST);
```

Wenn ich den fertigen Code haben hätte wollen, dann hätte ich hier gar nicht schreiben müssen.. ich wollt hier etwas verstehen!

Wie gesagt ich bin ein Anfänger, der das nur macht, weil ich meine Schule abschließen muss.

Wahrscheinlich ist der Fehler bei getContentPane().add(buttons,BorderLayout.EAST); für euch mega einfach nur ich habe keine Ahnung, was fehlt.

Von den Layouts her verstehe ich es schon, aber ich wusste zum Beispiel nicht dass er es automatisch in die Mitte gibt und so mein Zeichenpanel weg kommt.

Was jetzt mein Problem ist, er erstellt wieder nichts. Ich komm einfach durcheinander mit den ganzen einzelnen Sachen, die ich erstelle usw.


----------



## SlaterB (26. Okt 2011)

deswegen mein vielleicht übertriebener, aber zum Teil doch auch nützlicher Hinweis, mal zur Ruhe zu kommen,
ne halbe Stunde nichts zu posten sondern nur das Programm anzuschauen und versuchen zu verstehen welcher Befehl was macht,
was bei Weglassen/ Veränderung passiert usw.,
im Moment kopierst du nur alle 5 Min. neue Sachen und lernst dabei auch nicht viel..

aber im dem Tempo weiter:
was ist aus

```
kugelbewegt1=new kugelbewegt();
frame1.getContentPane().add(BorderLayout.CENTER,kugelbewegt1);
```
geworden?
fehlt jetzt, ergo nichts zu sehen,
wobei du evtl. vorher den Code abgeschnitten hast,


----------



## hdi (26. Okt 2011)

Also der Code kompiliert nicht:


```
getContentPane().add(buttons,BorderLayout.EAST);
```

Deine Klasse Kugel erbt jetzt nicht mehr von JFrame. D.h. du musst


```
frame1.getContentPane().add(buttons,BorderLayout.EAST);
```

schreiben.


----------



## Cosma (26. Okt 2011)

Okay ich hab den Fehler gefunden, ich hatte die Stellen, vertauscht und in  falscher Reihenfolge etwas geschrieben.

Nur noch eine Frage:
Das Panel, in dem es sich bewegen soll, habe ich eh erstellt?


----------



## hdi (26. Okt 2011)

> Das Panel, in dem es sich bewegen soll, habe ich eh erstellt?


Gegenfrage: Heute morgen hab ich eh Nutella gegessen?

Wie sollen wir so eine Frage beantworten. Kuck in deinen Code. In deinem letzten Code-Posting war keien Spur mehr von dem Panel oder einem entsprechenden add-Befehl, deswegen meinte Slater dass das nun fehlt.


----------



## Cosma (26. Okt 2011)

Ich bin echt dankbar für eure Hilfe, aber manche Aussagen könnte man sich echt sparen. 

Es ist vielleicht so, dass ich wirklich schlechter bin als schlecht, dann akzeptier bitte, dass ich halt solche Kleinigkeiten nicht aus meinem eigenen Code raussehe.


----------



## hdi (26. Okt 2011)

Cosma, wie du das Panel einfügst war bereits geklärt, und du hast den Code bereits gepostet. Dann hast du was am Code geändert, uns diese Änderung aber nicht gezeigt, und fragst dann ob das noch stimmt. Und sorry, das können wir schlichtweg nicht wissen.


----------



## Cosma (26. Okt 2011)

Ja ist egal. Ich hab den Fehler gefunden. Ich versuch es halt alleine weiter, denn ich will eure Zeit nicht noch länger vergeuden, weil ich einfach nicht so schnell bzw. nicht viel verstehe. 

Danke für eure Hilfe.


----------



## Cosma (26. Okt 2011)

Okay ich habe jetzt das ganze Programm angeschaut aber ich blick einfach nicht durch, wie ich jetzt die Kugel bewegen kann. Das Grundprinzip mit dem x+1 und y+1 ist klar aber ich kanns nicht ausführen, ich habe so viel rumprobiert, nachgelesen und gegoogelt. 


```
public class Kugel implements ActionListener {

   
    JFrame frame1=new JFrame();
    kugelbewegt kugelbewegt1;
    JButton start;
    JButton stop;
    JButton schneller;
    JButton langsamer;
    JPanel panel1;
    
  //Hauptmethode 
    public static void main(String[] args) {
       
       Kugel test=new Kugel();
       test.los();
        }
//erzeugt Frame
public void los()
{
    //Fensterdeklaration   
    
    frame1=new JFrame();
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(400, 400);
    
     
     kugelbewegt1=new kugelbewegt();
    frame1.getContentPane().add(BorderLayout.CENTER, kugelbewegt1);

        start=new JButton("Start!");
    stop=new JButton("Stop!");
    schneller=new JButton("Schneller!");
    langsamer=new JButton("Langsamer!");
    
    
    
    JPanel buttons=new JPanel();
    buttons.add(start);
    buttons.add(stop);
    buttons.add(schneller);
    buttons.add(langsamer);
    
     frame1.getContentPane().add(buttons,BorderLayout.SOUTH);
     
     frame1.setVisible(true); }

 @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }




    }
```


```
public class kugelbewegt extends JPanel {
 int x,y;
 int vx=1;
 int vy=1;
    
    @Override
public void paintComponent(Graphics g)
{   x=0;
    y=0;
    x=x+vx;
    y=y+vy; 
    
    
    g.setColor(Color.WHITE);
   g.fillOval(x, y, 50, 50); }}
```


----------



## SlaterB (26. Okt 2011)

was hast du denn so vieles nachgelesen?
gutes kann nicht dabei gewesen sein, denn in paintComponent() Positionen zu ändern ist kein empfehlenswertes Vorgehen,

richte dich z.B. wie schon genannt nach diesem Tutorial
http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html

was da an Bildern oder wer weiß was dabei ist, ist egal,
du brauchst einen Thread, das ist wichtig, suche das heraus


----------



## GUI-Programmer (26. Okt 2011)

Da muss ich dir Recht geben. Deshalb s.O.:


GUI-Programmer hat gesagt.:


> Daher mein Tipp, mach dich doch erstmal mit den Grundkenntnissen von GUIs vertraut.


----------

