Discussion:
KeyListener funktioniert nicht
(zu alt für eine Antwort)
k***@tiscali.ch
2006-10-02 09:21:14 UTC
Permalink
Also ich habe folgendes Problem:
ich bin ein ziemlicher Anfänger was Java betrifft und bei diesem
kleinen simplen Spiel stosse ich auf Probleme mit dem KeyListener.
Es ist eine Art MarioKart, die Oberfläche und alles zeigt es mir alles
schön und gut an, doch die Sache mit dem KeyListener geht nicht, wenn
ich die bestimmte Taste drücke sollte (vorerst ein Fahrer(mario)) um
eine gewisse x-achsen Zahl (die ja bestimmt werden kann) nach rechts
vorrücken zu können, doch bei meinem jetztigen Stand komme ich nicht
mehr weiter.
In der KeyPressed Methode habe ich auch noch ein System.out.println
getan doch selbst die funktioniert nicht

Hier der Code: Hoffe ihr könnt mir tipps geben --> code

import java.awt.BorderLayout;

import java.awt.Container;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MarioKart extends JFrame implements KeyListener,
ActionListener {

int a = 32;
int mx = 10;



JPanel buttonPanel = new JPanel();
JPanel racePanel = new JPanel();

//private JButton reset = new JButton("Restart Race");
private JButton quit = new JButton("Exit Game");

//ImageIcon mario = new ImageIcon(getIconImage(), "Mario.gif");
JLabel mario = new JLabel(new ImageIcon("Mario.gif"));
JLabel luigi = new JLabel(new ImageIcon("Luigi.gif"));
JLabel peach = new JLabel(new ImageIcon("Peach.gif"));
JLabel yoshi = new JLabel(new ImageIcon("Yoshi.gif"));
JLabel dk = new JLabel(new ImageIcon("DK.gif"));
JLabel bowser = new JLabel(new ImageIcon("Bowser.gif"));
JLabel koppa = new JLabel(new ImageIcon("Koppa.gif"));
JLabel toad = new JLabel(new ImageIcon("Toad.gif"));

private Container contentPane = new Container();



public MarioKart() {

setSize(600, 400);
setTitle("Mario Grand-Prix");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setFocusable(true);



// dem Container wird das Layout und die Panels übergeben
contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(BorderLayout.NORTH, buttonPanel);
contentPane.add(BorderLayout.CENTER, racePanel);

// dem buttonPanel wird ein Layout übergeben und der Knopf "reset"
buttonPanel.setLayout(new FlowLayout());
//buttonPanel.add(reset);
buttonPanel.add(quit);

quit.addActionListener(this);

// dem racePanel wird Layout(null) übergeben und alle JLabels mit
den Bildern der Fahrer
racePanel.setLayout(null);
//racePanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
racePanel.add(mario);
racePanel.add(luigi);
racePanel.add(peach);
racePanel.add(yoshi);
racePanel.add(dk);
racePanel.add(bowser);
racePanel.add(koppa);
racePanel.add(toad);

// den JLables(Bilder) muss jetzt Standort (x-achse und y-achse) und
die effektive Grösse des JLabels (Hier habe ich die genau
// die Grösse der Bilder genommen (32px, 32px)) übergeben werden
mario.setBounds(mx,50,a,a);
luigi.setBounds(10,82, a, a);
peach.setBounds(10,114, a, a);
yoshi.setBounds(10,146, a, a);
dk.setBounds(10,178, 32, a);
bowser.setBounds(10,210, a, a);
koppa.setBounds(10,242, a, a);
toad.setBounds(10,274, a, a);

addKeyListener(this);
this.requestFocus();

show();

}


public void movemario(int b1){

if (b1 == 1){

//mario.getLocation().getX();
mario.setBounds(mx+100,50,a,a);
//mx = mx+100;

}
}

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_N) {


System.out.println("hallo");
movemario(1);


//mx = mx+=100;

/*mario.setBounds(200,50,a,a);
mario.setLocation(200,50);
mario.setVisible(true);*/

}

}

public void keyReleased(KeyEvent e) {}


public void keyTyped(KeyEvent e) {}



public void actionPerformed(ActionEvent arg0) {

if (arg0.getSource() == quit) {
System.exit(0);
}

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

MarioKart mk = new MarioKart();
}



}
Michael Paap
2006-10-02 10:34:36 UTC
Permalink
Post by k***@tiscali.ch
In der KeyPressed Methode habe ich auch noch ein System.out.println
getan doch selbst die funktioniert nicht
Bei mir tuts dein Beispiel, wenn ich die N-Taste drücke, wird "hallo"
ausgegeben, natürlich nur, wenn das Fenster den Fokus hat.

Gruß,
Michael
roontafloor
2006-10-03 07:07:14 UTC
Permalink
habs jetzt mal ausprobiert, was noch nicht geht ist nach wie vor der
KeyListener hab das mit dem Focusable ein paar mal ausprobiert aber es
ist weiter nicht gegangen, und es gibt mir ein Fehler im Eclipse aus
bei mario.setLocation...
hier nochmal der code, verzwefle langsam aber sicher wirklich.

[code]
import java.awt.BorderLayout;

import java.awt.Container;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MarioKart extends JFrame implements KeyListener,
ActionListener {

int a = 32;




JPanel buttonPanel = new JPanel();
JPanel racePanel = new JPanel();

//private JButton reset = new JButton("Restart Race");
private JButton quit = new JButton("Exit Game");

//ImageIcon mario = new ImageIcon(getIconImage(), "Mario.gif");
JLabel mario = new JLabel(new ImageIcon("Mario.gif"));
JLabel luigi = new JLabel(new ImageIcon("Luigi.gif"));
JLabel peach = new JLabel(new ImageIcon("Peach.gif"));
JLabel yoshi = new JLabel(new ImageIcon("Yoshi.gif"));
JLabel dk = new JLabel(new ImageIcon("DK.gif"));
JLabel bowser = new JLabel(new ImageIcon("Bowser.gif"));
JLabel koppa = new JLabel(new ImageIcon("Koppa.gif"));
JLabel toad = new JLabel(new ImageIcon("Toad.gif"));

private Container contentPane = new Container();



public MarioKart() {

setSize(600, 400);
setTitle("Mario Grand-Prix");
setDefaultCloseOperation(EXIT_ON_CLOSE);



// dem Container wird das Layout und die Panels übergeben
contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(BorderLayout.NORTH, buttonPanel);
contentPane.add(BorderLayout.CENTER, racePanel);

// dem buttonPanel wird ein Layout übergeben und der Knopf
"reset"
buttonPanel.setLayout(new FlowLayout());

//buttonPanel.add(reset);
buttonPanel.add(quit);
setFocusable(false);
quit.addActionListener(this);


// dem racePanel wird Layout(null) übergeben und alle JLabels
mit den Bildern der Fahrer
racePanel.setLayout(null);

//racePanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
racePanel.add(mario);
racePanel.add(luigi);
racePanel.add(peach);
racePanel.add(yoshi);
racePanel.add(dk);
racePanel.add(bowser);
racePanel.add(koppa);
racePanel.add(toad);


// den JLables(Bilder) muss jetzt Standort (x-achse und y-achse)
und die effektive Grösse des JLabels (Hier habe ich die genau
// die Grösse der Bilder genommen (32px, 32px)) übergeben
werden
mario.setBounds(10,50,a,a);
luigi.setBounds(10,82, a, a);
peach.setBounds(10,114, a, a);
yoshi.setBounds(10,146, a, a);
dk.setBounds(10,178, 32, a);
bowser.setBounds(10,210, a, a);
koppa.setBounds(10,242, a, a);
toad.setBounds(10,274, a, a);

setVisible(true);
addKeyListener(this);
setFocusable(true);


}


/*public void movemario(int b1){

if (b1 == 1){

//mario.getLocation().getX();
mario.setBounds(mx+100,50,a,a);
//mx = mx+100;

}
}*/

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_N) {


System.out.println("hallo");
mario.setLocation(mario.getLocation().getX()+10,
mario.getLocation().getY());


}

}

public void keyReleased(KeyEvent e) {}


public void keyTyped(KeyEvent e) {}



public void actionPerformed(ActionEvent arg0) {

if (arg0.getSource() == quit) {
System.exit(0);
}

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

MarioKart mk = new MarioKart();
}
}
[/code]
roontafloor
2006-10-03 07:32:53 UTC
Permalink
Post by Michael Paap
Bei mir tuts dein Beispiel, wenn ich die N-Taste drücke, wird "hallo"
ausgegeben, natürlich nur, wenn das Fenster den Fokus hat.
Gruß,
Michael
habs jetzt mal ausprobiert, was noch nicht geht ist nach wie vor der
KeyListener hab das mit dem Focusable ein paar mal ausprobiert aber es
ist weiter nicht gegangen, und es gibt mir ein Fehler im Eclipse aus
bei mario.setLocation...
hier nochmal der code, verzwefle langsam aber sicher wirklich.

[code]
import java.awt.BorderLayout;

import java.awt.Container;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MarioKart extends JFrame implements KeyListener,
ActionListener {

int a = 32;




JPanel buttonPanel = new JPanel();
JPanel racePanel = new JPanel();

//private JButton reset = new JButton("Restart Race");
private JButton quit = new JButton("Exit Game");

//ImageIcon mario = new ImageIcon(getIconImage(), "Mario.gif");
JLabel mario = new JLabel(new ImageIcon("Mario.gif"));
JLabel luigi = new JLabel(new ImageIcon("Luigi.gif"));
JLabel peach = new JLabel(new ImageIcon("Peach.gif"));
JLabel yoshi = new JLabel(new ImageIcon("Yoshi.gif"));
JLabel dk = new JLabel(new ImageIcon("DK.gif"));
JLabel bowser = new JLabel(new ImageIcon("Bowser.gif"));
JLabel koppa = new JLabel(new ImageIcon("Koppa.gif"));
JLabel toad = new JLabel(new ImageIcon("Toad.gif"));

private Container contentPane = new Container();



public MarioKart() {

setSize(600, 400);
setTitle("Mario Grand-Prix");
setDefaultCloseOperation(EXIT_ON_CLOSE);



// dem Container wird das Layout und die Panels übergeben
contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(BorderLayout.NORTH, buttonPanel);
contentPane.add(BorderLayout.CENTER, racePanel);

// dem buttonPanel wird ein Layout übergeben und der Knopf
"reset"
buttonPanel.setLayout(new FlowLayout());

//buttonPanel.add(reset);
buttonPanel.add(quit);
setFocusable(false);
quit.addActionListener(this);


// dem racePanel wird Layout(null) übergeben und alle JLabels
mit den Bildern der Fahrer
racePanel.setLayout(null);

//racePanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
racePanel.add(mario);
racePanel.add(luigi);
racePanel.add(peach);
racePanel.add(yoshi);
racePanel.add(dk);
racePanel.add(bowser);
racePanel.add(koppa);
racePanel.add(toad);


// den JLables(Bilder) muss jetzt Standort (x-achse und y-achse)
und die effektive Grösse des JLabels (Hier habe ich die genau
// die Grösse der Bilder genommen (32px, 32px)) übergeben
werden
mario.setBounds(10,50,a,a);
luigi.setBounds(10,82, a, a);
peach.setBounds(10,114, a, a);
yoshi.setBounds(10,146, a, a);
dk.setBounds(10,178, 32, a);
bowser.setBounds(10,210, a, a);
koppa.setBounds(10,242, a, a);
toad.setBounds(10,274, a, a);

setVisible(true);
addKeyListener(this);
setFocusable(true);


}


/*public void movemario(int b1){

if (b1 == 1){

//mario.getLocation().getX();
mario.setBounds(mx+100,50,a,a);
//mx = mx+100;

}
}*/

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_N) {


System.out.println("hallo");
mario.setLocation(mario.getLocation().getX()+10,
mario.getLocation().getY());


}

}

public void keyReleased(KeyEvent e) {}


public void keyTyped(KeyEvent e) {}



public void actionPerformed(ActionEvent arg0) {

if (arg0.getSource() == quit) {
System.exit(0);
}

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

MarioKart mk = new MarioKart();
}
}
[/code]
Michael Paap
2006-10-03 08:37:52 UTC
Permalink
Post by roontafloor
habs jetzt mal ausprobiert, was noch nicht geht ist nach wie vor der
KeyListener hab das mit dem Focusable ein paar mal ausprobiert aber es
ist weiter nicht gegangen, und es gibt mir ein Fehler im Eclipse aus
bei mario.setLocation...
hier nochmal der code, verzwefle langsam aber sicher wirklich.
Sorry, aber wenn ich sowas lese, dann fühle ich mal wieder alle
Vorurteile ggü. Leuten mit komischen Nicknames in mir hochkommen.

1. Es gibt nicht "ihn", der irgendwas tut. So lange du noch
Compilerfehler hast, solltest du im Normalfalle den Code nicht
ausführen, also auch keine Laufzeitprobleme ("KeyListener geht nicht")
verkünden.

2. Deine Fehlerbeschreibung ist Müll. Lies bitte mal
http://feu.mpaap.de/propra/phaenomene.html und beherzige das sinngemäß:
Wenn du Probleme hast, es hinzukriegen, dass dein Anwendungsframe auf
Tastendrücke reagiert, dann baue ein Frame, was auf Tastendrücke
reagiert und lass allen Firlefanz weg, der zu deiner Anwendung gehört.

3. mario.setLocation gibt nicht "einen Fehler" in Eclipse aus, sondern
*den Fehler* "The method setLocation(int, int) in the type Component is
not applicable for the arguments (double, double)". Mit anderen Worten:
Du übergibst zwei doubles, setLocation will aber ints. Aber vergiss den
Krempel mit dem absoluten Setzen der Position eines Labes am besten von
vornherein wieder.

4. Du hast dir offenbar für deine Kenntnisse viel zu viel vorgenommen.
Beschreibe doch mal, was du eigentlich tun willst, und zwar bitte so
abstrakt, dass ich mir keinen Gedanken machen muss, was ein Mario oder
eine MarioKart ist. Etwa auf der Ebene "Ich möchte ein JFrame haben, auf
dem sich eine Figur bewegt, die sich durch die Tastatur steuern lässt"
oder so. *Das* Problem hatten sicher schon viele Leute, die können dir
alle helfen. Dutzende Zeilen Mario-Gedöns hingegen werden die wenigsten
lesen wollen.

5. Wenn ich die "mario.setLocation"-Zeile auskommentiere und das
Programm starte, reagiert es bei mir auf das Drücken der N-Taste, indem
es "hallo" auf die Eclipse-Konsole ausgibt. Bei dir nicht?

6. Wenn du dir einen vernünftig klingenden Namen zulegst und dir etwas
Mühe mit der Rechtschreibung gibst, lesen mehr Leute deine Postings und
die Hilfsbereitschaft wird generell größer.

Gruß,
Michael
roontafloor
2006-10-03 08:48:58 UTC
Permalink
Ja schon gut also mal einfach erklärt.

Wie du siehst habe ich zwei Panels und auf dem einen will ich ein Bild
Platzieren, was ja auch geklappt hat, jetzt möchte ich das sich das
Bild auf Tasteneingabe ein Stück nach rechts bewegt, eben mit
setLocation.... und das geht nicht. Der Grund hast du mir ja auch
gesagt deswegen lassen wir das mal beiseite.
Die KeyPressed Methode funktioniert nun eben bei mir gar nicht, auch
nicht wenn ich setLocation auskommentiere, heisst
System.out.println("hallo") gibt es mir nichts aus. Es gibt sozusagen
gar keine Ausgabe was ich komisch finde, weil es bei dir ja geklappt
hat und deswegen weiss ich nun nicht mehr weiter.
roontafloor
2006-10-03 09:10:57 UTC
Permalink
roontafloor schrieb:

so habe es jetzt hinbekommen, nicht so wie ich es gewollt habe aber ja.
Habe noch quit.addKeyListener(this); im hinzugefügt und obwohl der
Fokus auf dem Button wahr ging dann alles (System.out.println Ausgabe
und auch die Bewegung des Bildes) wenn der Fokus auf dem JPanel ist so
wie ich es eigentlich wollte klappt es wieder nicht. Aber so bin ich
eigentlich zufrieden.

Danke für die Hilfe
Sylvia Schuetze
2006-10-03 09:07:33 UTC
Permalink
Post by roontafloor
Die KeyPressed Methode funktioniert nun eben bei mir gar nicht, auch
nicht wenn ich setLocation auskommentiere, heisst
System.out.println("hallo") gibt es mir nichts aus. Es gibt sozusagen
gar keine Ausgabe was ich komisch finde, weil es bei dir ja geklappt
hat und deswegen weiss ich nun nicht mehr weiter.
Und du hast die Console in eclipse geöffnet?

Realname bitte angeben.

Gruß Sylvia.

Sylvia Schuetze
2006-10-03 08:39:56 UTC
Permalink
Post by roontafloor
Post by Michael Paap
Bei mir tuts dein Beispiel, wenn ich die N-Taste drücke, wird "hallo"
ausgegeben, natürlich nur, wenn das Fenster den Fokus hat.
Gruß,
Michael
habs jetzt mal ausprobiert, was noch nicht geht ist nach wie vor der
KeyListener hab das mit dem Focusable ein paar mal ausprobiert aber es
ist weiter nicht gegangen, und es gibt mir ein Fehler im Eclipse aus
bei mario.setLocation...
hier nochmal der code, verzwefle langsam aber sicher wirklich.
Verzweiflung ist ganz schlecht bei der Fehlersuche. :-)

Genau wie Michael schrieb, Dein erster Beispielcode klappt bei mir
(eclipse) insoweit, als dass der KeyListener funktioniert und hallo
*auf_der_Console* ausgegeben wird. Was genau passiert denn bei Dir im
ersten Beispiel?

Schraub doch dein gesamtes Beispiel mal zurück: mario reicht, alle
anderen können später kommen. Erst mal den Keylistenr zum Laufen
bringen, bzw., was ich vermute, die Console suchen.

Der Fehler bei mariosetLocation hat mit dem Keylistener nichts zu tun,
schau mal die Fehlermeldung von eclipse genau an.

Lange Rede, kurzer Sinn: immer Schritt für Schritt, nicht so wild
herumprobieren sondern erst mal ganz kleine Mechanismen ausprobieren und
die dann ausbauen.

Viel Erfolg Sylvia.
Wolfgang Rostek
2006-10-02 10:54:34 UTC
Permalink
Vielleicht hilft dieser Thread weiter

http://forum.java.sun.com/thread.jspa?forumID=57&threadID=639615

besonders, wenn die Aktionen 'global' sein sollen.

Gruß
Wolfgang R.
Loading...