Kugel diagonal laufen lassen

Cosma

Aktives Mitglied
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?
 

Cosma

Aktives Mitglied
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...

Java:
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.");
    }


  

  
        
        
    }
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Cosma

Aktives Mitglied
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

Top Contributor
Java:
    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".
 
S

SlaterB

Gast
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

Aktives Mitglied
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

Aktives Mitglied
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? ;)

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 :)
 

hdi

Top Contributor
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

Top Contributor
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

Aktives Mitglied
Java:
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);
   
}
Java:
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

Top Contributor
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 :D
 

Cosma

Aktives Mitglied
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

Top Contributor
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:

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

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

Java:
getContentPane().add(buttons, BorderLayout.SOUTH);
 
S

SlaterB

Gast
@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

Top Contributor
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

Aktives Mitglied
Java:
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.
 
S

SlaterB

Gast
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
Java:
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

Top Contributor
Also der Code kompiliert nicht:

Java:
getContentPane().add(buttons,BorderLayout.EAST);

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

Java:
frame1.getContentPane().add(buttons,BorderLayout.EAST);

schreiben.
 

Cosma

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

Aktives Mitglied
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.

Java:
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.");
    }




    }

Java:
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); }}
 

Ähnliche Java Themen

Neue Themen


Oben