Domanda

Ho il seguente:

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();
    }
}

seconda classe:

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
        }
    }
}

Perché non la cornice diventa rosso quando ho colpito la freccia sinistra? Ho anche avuto con nessuna prova keycode pensare che non importa la chiave che avrebbe funzionato, ma non lo feci. Grazie.

È stato utile?

Soluzione

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

JPanel deve essere attivabile per ricevere KeyEvents

Altri suggerimenti

componenti Swing dovrebbero usare principali Associazioni (non KeyListeners) per invocare un'azione quando si utilizza la tastiera. Un vantaggio collaterale di questo è che così non devi preoccuparti di focusability.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top