Frage

Ich habe Folgendes:

import javax.swing.JFrame;

public class Directions {

    public Directions(){
        JFrame frame = new JFrame("Direction");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DirectionPanel());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Directions myTest = new Directions();
    }
}

zweite Klasse:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class DirectionPanel extends JPanel{
    public DirectionPanel(){
        addKeyListener(new DirectionListener());
        setBackground(Color.yellow);
    }

    private class DirectionListener implements KeyListener{

        @Override
        public void keyPressed(KeyEvent e) {
            //JOptionPane.showMessageDialog(null, "Hello Johnny");
            int keyCode = e.getKeyCode();
            if (keyCode == KeyEvent.VK_LEFT){
                setBackground(Color.red);
            }
            repaint();
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
        }
    }
}

Warum wird der Rahmen nicht rot, wenn ich den linken Pfeil drücke? Ich hatte es auch ohne KeyCode -Test und dachte, dass es unabhängig von dem Schlüssel funktionieren würde, aber nicht. Vielen Dank.

War es hilfreich?

Lösung

public DirectionPanel(){
   addKeyListener(new DirectionListener());
   setFocusable(true);// INSERT THIS
   setBackground(Color.yellow);
}

JPanel muss fokussierbar sein, um KeyEvents zu empfangen

Andere Tipps

Schwungkomponenten sollten verwenden Tastenbelegungen (Nicht Keylisten) zum Aufrufen einer Aktion, wenn die Tastatur verwendet wird. Ein Nebenevorteil davon ist so, dass Sie sich keine Sorgen um die Fokussierbarkeit machen müssen.

Action left = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        System.out.println( "Left" );
    }
};

Object key1 = "left";
KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0);
panel.getInputMap(JPanel.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(ks1, key1);
panel.getActionMap().put(key1, left);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top