# Ping Pong Frage



## Guest (24. Mrz 2008)

ich bin gerade dabei ein PingPong Spiel zu programmieren, bzw ich versuche es:
ich habe 2 klassen bis jetzt 

PingPongGUI
Rechteck(Die klasse für die 2 Schläger)

ich will der GUI einen KeyListener(Klasse Rechteck) geben
nur das lasst sie nicht zu.
und ich weiß auch nicht ob ich bei der GUI(JFrame)  " ping.getContentPane().add(this) " machen kann oder wem sollte ich das sonst zuweisen ?
der KeyListener ist doch dazu da damit ich die Schläger bewegen kann, oder ?





```
Rechteck

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
/*
 * Rechteck.java
 *


public class Rechteck implements KeyListener 
{
    int x;
    int y;
    Graphics g;
    JPanel p;
    PingPongGUI ping;
    
    /** Creates a new instance of Rechteck */
    public Rechteck(int x, int y, JPanel p,PingPongGUI ping) 
    {
        this.x = x;
        this.y = y;
        this.p = p;
       
        g = p.getGraphics();
         this.ping = ping;
        ping.getContentPane().add(this)    <-----    HIER FEHLER!!
        ping.addKeyListener(this);
    }
    
    public void zeichne()
    {
        g.drawRect(x,y,20,60);
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) 
    {
        int a = e.getKeyCode();
        //int b = e.getKeyText(2);
        int key = e.getKeyChar();
        System.out.println("sss"+ key+""+a+"");
    }

    public void keyReleased(KeyEvent e) 
    {
        int a = e.getKeyCode();
        //int b = e.getKeyText(2);
        int key = e.getKeyChar();
        System.out.println("sss"+ key+""+a+""); 
    }
}






PingPongGUI



public class PingPongGUI extends javax.swing.JFrame {
    
    
  
    Rechteck r;
    /** Creates new form PingPongGUI */
    public PingPongGUI() 
    {
        initComponents();
        
    }
    
                    

    private void OnStart(java.awt.event.ActionEvent evt) {                         
        r =  new Rechteck(10,30,pnSpiel,this);
        r.zeichne();
    }                        
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new PingPongGUI().setVisible(true);
            }
        });
    }
```


----------



## Marco13 (24. Mrz 2008)

Schau dir mal die Tutorials zum "Zeichnen in Swing" und "Versuch eines deutschen Tutorials" an, und außerdem 
http://java.sun.com/products/jfc/tsc/articles/painting/
und 
http://java.sun.com/docs/books/tutorial/uiswing/

Man kann nur Components zum ContentPane adden, und "getGraphics" auf einer Component aufzurufen ist fast immer falsch.


----------



## Suckly0 (25. Mrz 2008)

ja aber ich kann der GUI ja mit 

ping.addKeyListener(this);

den Listener übergeben, nur muss ich noch eine Komponente hinzufügen, oder ?

nur was soll ich hier

ping.getContentPane().add(this)

übergeben, er verlangt eine Komponente und meine Klasse Rechteck ist keine Komponente.


PS: ich war vorher nicht eingeloggt.


----------



## SlaterB (25. Mrz 2008)

was genau ist deine Frage?

ja, wenn du getContentPane().add(irgendwas) aufrufen willst,
dann muss irgendwas eine Komponente sein,

Rechteck ist keine Komponente, mache Rechteck zur Komponente oder lasse den Aufruf sein,
was ist deine Frage?

>  nur muss ich noch eine Komponente hinzufügen, oder ? 

müssen tut man gar nix auf der Welt, 
wenn ich jetzt mit Ja oder Nein antworte, welche Info bringt dir das?
warum willst du überhaupt das adden oder auch nicht, welches Ziel verfolgst du?
was hat das aktuell mit dem KeyListener zu tun?

zum Registrieren des Listeners reicht
ping.addKeyListener(this);

-------------

g = p.getGraphics(); 

rufe NIE getGraphics() bei eine Swing/ AWT-Komponente auf,
siehe Links von Marco13


----------



## Suckly0 (25. Mrz 2008)

wie  kann ich "Rechteck" zu einer Kompnonente machen ?

ich will das die Klasse Rechteck auf die Tastatureingaben reagiert, damit ich das Rechteck bewegen kann.






> zum Registrieren des Listeners reicht
> ping.addKeyListener(this);



ja aber muss ich nicht noch etwas adden mit 

getContentPane().add(irgendwas) 

weil sonst geht das ja nicht ?!


----------



## SlaterB (25. Mrz 2008)

ne, du musst nur für die Reaktion nichts weiter adden

ansonsten von JComponent erben,
wenn du die Frage aber so stellst, dann scheinst du ja nichts davon zu wissen,
auch in Verbindung mit getGraphics(); usw.

das ist nicht gerade etwas was man sich per try/ error zusammenklicken kann..

guter Rat: lies dir Tutorials durch, arbeite Beispiele ab,
sonst wirst du alle 5 Min. irgendwo hängen bleiben


----------



## Suckly0 (25. Mrz 2008)

das heisst wenn ich nur 

ping.addKeyListener(this)


aufrufe, müsste sich das Rechteck auch bewegen ?


----------



## SlaterB (25. Mrz 2008)

von Bewegung war nicht die Rede da dein gesamtes Zeichnen usw.
noch auf getGraphics() basiert und damit nicht funktioniert

und deine Operation zeichne() wird anscheinend nur einmal aufgerufen, danach nie wieder,
zu sehen ist das also höchstwahrscheinlich nix, egal ob du addest oder nicht,
egal ob du auf KeyEvents reagierst oder nicht (das Event löst kein Zeichnen aus)


----------



## Suckly0 (25. Mrz 2008)

ja aber wie soll ich Graphics sonst aufrufen ?

die einzige methode die ich kenne ist:

g = JPanel.getGraphics();

und  soll ich r.zeichne in eine while(true) schleife geben ?
oder muss ich r.zeichne() in einem KeyEvent aufrufen ?


----------



## SlaterB (25. Mrz 2008)

du musst die Links von Marco13 durchlesen
und tage- bis wochenlang das hochkomplexe Zeichensystem von Swing lernen,
wie oft soll man das noch wiederholen?

Grundtenor ist:
nur repaint() aufrufen und dann mit dem Graphics-Objekt vom automatisch aufgerufenen
public void paintComponent(Graphics g)
arbeiten

> oder muss ich r.zeichne() in einem KeyEvent aufrufen ?

so in der Art, dafür würde ich aber (nachdem du das Zeichen von Swing kennst)
erstmal entsprechende Beispiele suchen und analysieren,
das ist in 3 Sätzen im Forum kaum abgehandelt


----------



## Marco13 (25. Mrz 2008)

while (usingGetGraphicsOnComponent) postLinkTo( http://www.java-forum.org/de/viewtopic.php?p=278628 );


----------



## Marco13 (25. Mrz 2008)

Naja, "hochomplex" ist das Zeichensystem in  Swing eigentlich nicht. Genaugenommen ist es ziemlich straightforward: Man zeichnet in paintComponent, in paintComponent, und NUR in paintComponent. (Und getGraphics ist böse). Mehr gibt's eigentlich kaum zu wissen. Was der Benutzer/Entwickler aus dieser Information macht, ist eine andere Frage... :roll:


----------



## rellix (7. Nov 2008)

Ich habe ein Problem! Mein Ping Pong Java Programmierung hat bei dem Punkt (public class Pong extends JApplet implements KeyListener, Runnable{) einen Fehler: illegal start of expression
Kann mir bitte einer helfen!


----------



## SlaterB (7. Nov 2008)

poste die ganze Datei, und wirf vorher möglichst alle Methoden usw raus


----------



## Quaxli (9. Nov 2008)

Tutorial für Spieleprogrammierung auf Applet-Basis


----------



## rellix (11. Nov 2008)

Hallo erstmal!
Ich hab immer noch ein Problem mit meiner Java Ping Pong Programmierung. Ich benutze NetBeans 6.1, und wenn ich auf den run-Button klicke kommt garnichts. Also einfach nur "run-single", und danach garnichts. An was kann das liegen? :roll:


----------



## SlaterB (11. Nov 2008)

du weißt, dass ein Applet kein normales Programm ist, sondern etwas mit einem WebBrowser zu tun hat?


----------



## rellix (11. Nov 2008)

Natürlich weiss ich das :!:


----------

