# KeyListener



## MrOpalala (28. Nov 2011)

Hallo Leute!
Ich habe ein Probelm mit meinen Key und MouseMotion Listener. Undzwar habe ich zwei Spiele in denen ich diese Listener benutze und will diese mit einem Menü aufrufen. Wenn ich jetzt nur den Konstruktor der Klasse aufrufe funktionieren die Listener nicht. Kann mir da jemand weiterhelfer?


----------



## eRaaaa (28. Nov 2011)

Sorry, aber ???:L:autsch::bahnhof:

Kannst du das evtl. noch ein wenig genauer beschreiben evtl. auch mit einem simplen Codebeispiel?


----------



## c_sidi90 (28. Nov 2011)

Der Fehler liegt ganz klar in Zeile 1443   Kann mich meinem Vorredner nur anschließen, wie soll dir jemand mit so einer Problembeschreibung im Themenbereich der Programmierung helfen?!


----------



## BlackTiger95 (29. Nov 2011)

Ja Codebeispiel währe hilfreich ich würde auf anhieb sagen du hast vergessen den Listener zum Fenster hinzuzufügen. XD


----------



## MrOpalala (29. Nov 2011)

So hier mal n bisschen Code:

Erst mal die Klasse von Spiel:
[JAVA=42]
import java.awt.image.BufferStrategy;
import java.awt.image.MemoryImageSource;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;


public class MainPong extends JFrame implements MouseMotionListener, KeyListener{
.
.
.
.
.
.
 public MainPong() {
.
.
.
 addMouseMotionListener(this);
 addKeyListener(this);
.
.
 initGame();

        while(true) {
            long start = System.currentTimeMillis();
            SpielLogik();
            while(System.currentTimeMillis()-start < 5) {

            }
}
[/code]

So, an sich funktioniert das Spiel wenn es halt direkt gestartet wird.
Aber wenn man den Konstruktor der Klasse im JFrame über einen Button Aufruft wir alles gezeichnet und der ball Bewegt sich auch. Nur die Listener funktionieren nicht

Hier mal das JFrame:
[JAVA=42]
public class Menu extends javax.swing.JFrame {


    private MainPong dasSpiel;
    /** Creates new form Menu */
    public Menu() {
        initComponents();
    }
.
.
.
.
.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        dasSpiel = new MainPong();

    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Menu().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    // End of variables declaration

}
[/code]


----------



## SlaterB (29. Nov 2011)

zwei Klassen die von JFrame erben?
KeyListener kannst du maximal einem JPanel zuweisen, dann Focus nicht vergessen,

siehe auch
http://www.java-forum.org/awt-swing-swt/127506-snake-java-keylistener-problem.html


----------



## Mofi (29. Nov 2011)

Dein Code verwirrt sehr...Aber was passiert dann mit dem Menu JFrame? Bleibt der offen so dass beide JFrame gelichzeitig laufen oder lässt du den verschwinden?

Ansonsten würde mir grade einfallen...Versucht den zweiten JFrame in einen extra Thread zu tun?

Aber du könntest auch mal die Listener zeigen, wenn es die sind die Probleme machen.


----------



## MrOpalala (29. Nov 2011)

Es dürfte ja eigentlich nicht an den Listener Selber liegen denn wenn ich das Spiel normal (also mit run file) Starte geht ja alles. Nur wenn ich die Spiel klasse über den Button öffne gehen die Listener nicht und das Frame lässt sich auch nicht schließen. 

Hier mal die Listener:
 [JAVA=42]
 public void mouseMoved(MouseEvent e) {
        if(e.getX() < 599){
            schlaeger.x = e.getX();
        }
    }

 public void keyPressed(KeyEvent e) {
         if(e.getKeyChar() == 's'){
            if(SoundAN == true){
                SoundAN = false;
            }else SoundAN = true;
        }

        if(e.getKeyChar()== 'p'){
            if(Pause == false){
                Pause = true;
            }else Pause = false;
        }
     }
[/code]


----------



## SlaterB (29. Nov 2011)

die main-Methode ist ein separater Thread,
von einem Button aus gestartet verwendest du dagegen den AWT-Thread,

falls es eine längerfristige Aktion wie die angedeutete while(true)-Schleife gibt, dann besteht tatsächlich ein Problem,
starte MainPong in einem separaten Thread

Schleifen wie
> while(System.currentTimeMillis()-start < 5) {   }
laufen übrigens ununterbrochen mit 100% CPU-Last, mit Thread.sleep() könntest du dagegen ganz sanft eine Pause einlegen


----------

