Supportnet / Forum / Anwendungen(Java,C++...)
KeyListener
Frage
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 dazu habe ich auch noch ein System.out.println in die KeyPressed 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;
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);
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);
addKeyListener(this);
show();
}
public static void main(String args[]) {
MarioKart mk = new MarioKart();
}
public void movemario(int b1){
if (b1 == 1){
mario.getLocation().getX();
mario.setLocation((10+50), 10);
}
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
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 event) {
System.out.println("hallo");
/*if (event.getKeyCode() == KeyEvent.VK_F10) {
//mario.setBounds(200,50,a,a);
mario.setLocation(200,50);
//mario.setVisible(false);
}*/
}
public void keyTyped(KeyEvent arg0) {
System.out.println("hallo");
/*if (arg0.getKeyCode() == KeyEvent.VK_F10) {
mario.setBounds(200,50,a,a);
mario.setLocation(200,50);
mario.setVisible(true);
}*/
}
public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == quit) {
System.exit(0);
}
}
}
[/code]
Antwort 1 von Dr.Ma-Busen
Moin!
Die KeyEvents werden alle an dein Exit Button gesendet weil das den Focus hat. Du musst dafür sorgen das dein JFrame den Focus bekommt oder dein racePanel.
Versuch mal im Konstruktor vor oder nach dem addKeyListener setFocusable(true) zu setzten.
MfG
Die KeyEvents werden alle an dein Exit Button gesendet weil das den Focus hat. Du musst dafür sorgen das dein JFrame den Focus bekommt oder dein racePanel.
Versuch mal im Konstruktor vor oder nach dem addKeyListener setFocusable(true) zu setzten.
MfG
Antwort 2 von 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....
hier nochmal der code, verzwefle langsam aber sicher wirklich....
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();
}
}Antwort 3 von Dr.Ma-Busen
Also bei mir hier Funktioniert das mit setFocusable(true). Warum das bei dir nicht geht kann ich jetzt auch nicht sagen.
Die Fehlermeldung die du bei mario.setLocation bekommst, kommt daher das setLocation entwder ein Point Object erwartet oder zwei Int werte (x und y) getLocation().getX() gibt aber Double werte zurück.
Musst also entweder die Werte mit einen Castoperator umwandeln oder die Methode translate() vom Point-Object benutzen die dir getLocation zurückgibt.
MfG
Die Fehlermeldung die du bei mario.setLocation bekommst, kommt daher das setLocation entwder ein Point Object erwartet oder zwei Int werte (x und y) getLocation().getX() gibt aber Double werte zurück.
Musst also entweder die Werte mit einen Castoperator umwandeln oder die Methode translate() vom Point-Object benutzen die dir getLocation zurückgibt.
MfG

