KeyListener funktioniert nicht

Schakdelagdefrö

Neues Mitglied
Guten Tag,

Ich wollte mal testen wie man ein Programm mittels Tasten steuern kann, jedoch schaff ich es nicht, dass das Programm auf den Tastendruck reagiert und ich weiß nicht wo das Problem liegt.
Zum Testen hab ich einfach ein Programmfenster erstellt, welches nichts weiter können soll, als sich zu schließen, wenn die Taste "W" gedrückt wird.
Wäre cool wenn ihr mir helfen könntet.

Hier ist der Code:

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;

public class Test extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            Test frame = new Test();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });
    }

    /**
     * Create the frame.
     */
    public Test() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W) {
            System.exit(0);
            }
        }
    });
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    }
}

Mit freundlichen Grüßen
Schakdelagdefrö
 
Damit das contentPane KeyEvents bekommt, müsste es den Focus besitzen, deshalb würde ich empfehlen, den KeyListener an den JFrame zu binden.

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;

public class Test extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test frame = new Test();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Test() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_W) {
                    System.exit(0);
                }
            }
        });
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
    }
}
 
Vielen Dank, so funktioniert es.

Jedoch hab ich jetz ein weiteres Problem.
Ich hab jetzt mal versucht ein Programm zu erstellen mit dem ich einen Ball mittels WASD über den Bildschirm steuern kann. Vorerst hab ich die Steuerung durch Buttons gemacht, was auch funktioniert. Nun hab ich versucht, das Programm so zu verändern, dass ich auch mit der Taste "W" den Ball nach oben bewegen kann. Es reagiert aber nicht auf den Tastendruck. Ich hab keine Ahnung welches Programmteil den Focus hat oder wie ich den Focus auf ein Programmteil legen kann. Ich hab sogar mehrer KeyListener an unterschiedliche Programmteile angefügt, mit der selben Anweisung, jedoch scheint keines von denen den Focus zu haben. Ich hab es auch schon mit requestFocus() probiert, das hat aber auch nicht funktioniert.

Java:
package gui13;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import net.miginfocom.swing.MigLayout;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class BallNavigator extends JFrame {

    private JPanel contentPane;
    Thread t;
    private JButton btnW;
    private JButton btnA;
    private JButton btnS;
    private JButton btnD;
    private JPanel panelSchalter;
    static Boolean hoch = false;
    static Boolean runter = false;
    static Boolean links = false;
    static Boolean rechts = false;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            BallNavigator frame = new BallNavigator();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });
    }

    /**
     * Create the frame.
     */
    public BallNavigator() {
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_W) {
                 hoch = true;
                 runter = false;
                 links = false;
                 rechts = false;
                }
            }
        });
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 305);
    contentPane = new JPanel();
    contentPane.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W) {
               hoch = true;
               runter = false;
               links = false;
               rechts = false;
              }
        }
    });
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(new MigLayout("", "[grow]", "[grow][::60px,grow]"));
 
    JBallPanel panelSpielflaeche = new JBallPanel();
    panelSpielflaeche.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W) {
                hoch = true;
                runter = false;
                links = false;
                rechts = false;
               }
        }
    });
    contentPane.add(panelSpielflaeche, "cell 0 0,grow");
 
    panelSchalter = new JPanel();
    panelSchalter.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W) {
              hoch = true;
              runter = false;
              links = false;
              rechts = false;
             }
        }
    });
    contentPane.add(panelSchalter, "cell 0 1,grow");
    panelSchalter.setLayout(new MigLayout("", "[][][][][][][][][][][][][]", "[][]"));
 
    JButton btnStart = new JButton("Start");
    btnStart.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_W) {
               hoch = true;
               runter = false;
               links = false;
               rechts = false;
              }
        }
    });
    btnStart.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if(t == null) {
            t = new Thread(panelSpielflaeche);
            }
            if(!t.isAlive()) {
            t.start();
            }
            btnW.setEnabled(true);
            btnA.setEnabled(true);
            btnS.setEnabled(true);
            btnD.setEnabled(true);
        }
    });
    panelSchalter.add(btnStart, "cell 2 0");
 
    JButton btnStop = new JButton("Stop");
    btnStop.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if(t != null) {
             t.interrupt();
             t = new Thread(panelSpielflaeche);
            }
            btnW.setEnabled(false);
            btnA.setEnabled(false);
            btnS.setEnabled(false);
            btnD.setEnabled(false);
        }
    });
 
    btnW = new JButton("W");
    btnW.setEnabled(false);
    btnW.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            hoch = true;
            runter = false;
            links = false;
            rechts = false;
        }
    });
    panelSchalter.add(btnW, "cell 6 0");
    panelSchalter.add(btnStop, "cell 10 0");
 
    btnA = new JButton("A");
    btnA.setEnabled(false);
    btnA.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            hoch = false;
            runter = false;
            links = true;
            rechts = false;
        }
    });
    panelSchalter.add(btnA, "cell 5 1");
 
    btnS = new JButton("S");
    btnS.setEnabled(false);
    btnS.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            hoch = false;
            runter = true;
            links = false;
            rechts = false;
        }
    });
    panelSchalter.add(btnS, "cell 6 1");
 
    btnD = new JButton("D");
    btnD.setEnabled(false);
    btnD.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            hoch = false;
            runter = false;
            links = false;
            rechts = true;
        }
    });
    panelSchalter.add(btnD, "cell 7 1");
    }

}

Hier noch der Code von JBallPanel. Der Fehler liegt aber vermutlich im ersten Quellcode.

Java:
package gui13;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;

import javax.swing.JPanel;

public class JBallPanel extends JPanel implements Runnable{
 
    private int x = 0;
    private int y = 0;
    private Image img;
    boolean rechts = false;
    boolean links = false;
    boolean hoch = false;
    boolean runter = false;
 
 
    JBallPanel() {
    setBackground(Color.white);
    img = Toolkit.getDefaultToolkit().getImage("." +File.separator +"Ball.jpg");
    }

    public synchronized void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, x, y, img.getWidth(this), img.getHeight(this), this);
    }
 
    @Override
    public void run() {
    while(true) {
        synchronized (this) {
            if(BallNavigator.hoch) {
                y -= 2;
            }
            if(BallNavigator.runter) {
                y += 2;
            }
            if(BallNavigator.rechts) {
                x += 2;
            }
            if(BallNavigator.links) {
                x -= 2;
            }
        }
        repaint();
        try {
        Thread.sleep(20);
        } catch (InterruptedException e) {
        break;
        }
    }
    }

}

EDIT:
Jetzt funktioniert es. Der Focus liegt nach dem Drücken des Start-Buttons auf selbigen. Ich hab nur vorher immer die anderen Buttons zum Steuern betätig, sodass auf diesen der Focus lag, jedoch haben diese keinen Listner.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben