Avatar billede MaleneNS Praktikant
08. marts 2020 - 10:33 Der er 12 kommentarer

Kan ikke bruge mit MAC tastatur i KeyEvent i JAVA

Hej.

Jeg er ved at programmere et "Snake Game" program i Java, og alt spiller på nær at kunne bevæge slangen.
Jeg kan få lov at skrive til JFrame, men kan ikke få lov at flytte slangen.
Jeg benytter KeyEvent, og e.getKeyCode== kommandoen.
Synes jeg hart prøvet alt, så er lidt i tvivl om det er en hardware indstilling der låser for brug.
Jeg bruger en MacBook Pro, og har den på nogle tidspunkter sat til et eksternt tastatur og mus via en HUB. Ingen af tastaturerne virker.

Vil virkelig sætte pris på gode råd. Og smider gerne koden op......

Tak fra Malene
Avatar billede arne_v Ekspert
08. marts 2020 - 18:51 #1
Bruger du keyPressed, keyReleased eller keyTyped?
Avatar billede MaleneNS Praktikant
08. marts 2020 - 20:19 #2
Jeg har indsat alle 3  metoder via @override.
Avatar billede arne_v Ekspert
08. marts 2020 - 22:53 #3
keyPressed er nok den rigtige.

Men kan du ikke dumpe  e.getKeyCode() ud og se hvad den faktisk modtager?
Avatar billede MaleneNS Praktikant
09. marts 2020 - 19:21 #4
@Override
    public void keyPressed(KeyEvent e) {

                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    moves++;
                    right = true;
                    if (!left) {

                        right = true;
                    } else {
                        right = false;
                        left = true;
                    }
                    up = false;
                    down = false;

                    if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                        moves++;
                        left = true;
                        if (!right) {

                            left = true;
                        } else {
                            left = false;
                            right = true;
                        }
                        up = false;
                        down = false;

                        if (e.getKeyCode() == KeyEvent.VK_UP) {
                            moves++;
                            up = true;
                            if (!down) {

                                up = true;
                            } else {
                                up = false;
                                down = true;
                            }
                            left = false;
                            right = false;

                            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                                moves++;
                                down = true;
                                if (!up) {

                                    down = true;
                                } else {
                                    down = false;
                                    up = true;
                                }
                                left = false;
                                right = false;
                            }
Avatar billede MaleneNS Praktikant
09. marts 2020 - 19:22 #5
Har smidt koden op nu. Håber du måske kan hjælpe :)
Avatar billede arne_v Ekspert
09. marts 2020 - 19:35 #6
Prøg og kør programmet i et konsol vindue og tilføj en linie:

public void keyPressed(KeyEvent e) {
    System.out.println(e.getKeyCode());
    ....

Så du kan se hvad programmet faktisk modtager.
Avatar billede MaleneNS Praktikant
09. marts 2020 - 19:56 #7
Den modtaget ikke noget:/

Kan ikke lige gennemskue hvad der er galt
Avatar billede arne_v Ekspert
10. marts 2020 - 01:24 #8
Din klasse med de metoder

implements KeyListerner

eller ville du få en fejl på @Overide

Men får du også kaldt addKeyListener med en instans?
Avatar billede MaleneNS Praktikant
10. marts 2020 - 10:09 #9
Jeg kalder addKeyListener (this) i min Game klasse:


class GamePlay extends JPanel implements KeyListener, ActionListener {

    private int[] snakeXlength = new int[750];
    private int[] snakeYlength = new int[750];
    private boolean left = false;
    private boolean right = false;
    private boolean up = false;
    private boolean down = false;
    private ImageIcon rightmouth;
    private ImageIcon leftmouth;
    private ImageIcon upmouth;
    private ImageIcon downmouth;
    private int lengthOfSnake = 3;
    private Timer timer;
    private int delay = 100;
    private ImageIcon snakeimage;
    private Random random = new Random();
    private int xpos = random.nextInt(34);
    private int ypos = random.nextInt(23);
    private int score = 0;
    private ImageIcon titleImage;
    private int moves;

    public GamePlay() {
        addKeyListener(this);
        // addKeyListener(new MKeyListener());
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(delay, this);
        timer.start();
Avatar billede arne_v Ekspert
10. marts 2020 - 15:39 #10
Er der fokus paa det panel?

Maaske var det bedre at saette key listener paa framen.
Avatar billede MaleneNS Praktikant
11. marts 2020 - 20:53 #11
Jeg har sat key listener ind i main, i frame.
Kan få lov at skrive tekst til konsollen, men den vil ikke flytte noget i selve spillet

public class Main extends JFrame implements KeyListener, ActionListener {

    public static void main(String[] args) throws Exception {

        JFrame obj = new JFrame("Key Listener");
        GamePlay gamePlay = new GamePlay();
        KeyEvents keyEvents = new KeyEvents();
        KeyListener listener = new KeyListener()
        {
            @Override
            public void keyTyped(KeyEvent e) {

            }
          @Override
            public void keyPressed(KeyEvent e) {

                GamePlay gamePlay=new GamePlay();
                gamePlay.keyPressed(e);

                if (e.getKeyCode() == KeyEvent.VK_RIGHT)
                    System.out.println("rr");
                else if (e.getKeyCode() == KeyEvent.VK_LEFT)
                    System.out.println("ll");
                else if (e.getKeyCode() == KeyEvent.VK_DOWN)
                    System.out.println("dd");
                else if (e.getKeyCode() == KeyEvent.VK_UP)
                    System.out.println("ii");
            }
            @Override
            public void keyReleased(KeyEvent e) {

            }
        };
        obj.setVisible(true);

        obj.setBounds(10, 10, 905, 700);
        obj.setBackground(Color.DARK_GRAY);
        obj.setResizable(false);
        obj.add(gamePlay);
        obj.add(keyEvents);
        obj.addKeyListener(listener);
        obj.setFocusable(true);
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }
    }
Avatar billede Pyrros Novice
06. april 2020 - 00:16 #12
Fik du løst det?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Sådan tager top-CIO Pernille Geneser livtag med 40 år gamle it-systemer i Stark Group med 10.000 medarbejdere