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
arne_v Ekspert
08. marts 2020 - 18:51 #1
Bruger du keyPressed, keyReleased eller keyTyped?
MaleneNS Praktikant
08. marts 2020 - 20:19 #2
Jeg har indsat alle 3  metoder via @override.
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?
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;
                            }
MaleneNS Praktikant
09. marts 2020 - 19:22 #5
Har smidt koden op nu. Håber du måske kan hjælpe :)
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.
MaleneNS Praktikant
09. marts 2020 - 19:56 #7
Den modtaget ikke noget:/

Kan ikke lige gennemskue hvad der er galt
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?
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();
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.
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) {
    }
    }
Pyrros Novice
06. april 2020 - 00:16 #12
Fik du løst det?
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

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





Premium
2021 bliver et usædvanligt tv-år: Producenterne vil sætte fuld fokus på billedkvalitet og pris
I stedet for at koncentrere sig om stadigt højere opløsninger og buede skærme, lægger tv-industrien i 2021 op til at satse på det helt rigtige: Billedkvaliteten og prisen.
Computerworld
Nokia tog afsked med tusindvis af ansatte efter kæmpe nedtur: Sådan går det for dem i dag
Mere end 21.000 forlod Nokia under selskabets nedtur, som også ramte hårdt i Danmark. Nu har forskere undersøgt, hvordan det er gået for de tidligere Nokia-folk.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Microsoft i kæmpe dansk satsning - åbner tre store datacentre i Danmark
Microsoft lancerer kæmpe satsning fra hovedkvarteret i Lyngby. Selskabet åbner tre store bæredygtige datacentre på Sjælland.
White paper
Digital transformation tvinger organisationer til at nå deres digitale mål på nye måder
Allerede for to år siden hævdede nordiske virksomheder, at virksomhedernes konkurrenceevne og sågar overlevelse var afhængig af en vellykket digitalisering. De var klar, fulde af håb og på vej mod det digitale paradis. Hvordan gik det så? Hvor er de nu? For at finde ud af det, interviewede DigiPlex og Norstat 377 forretningsledere og IT-beslutningstagere fra organisationer fordelt over hele Danmark, Sverige og Norge om deres digitaliseringsfremskridt, om hvordan de har håndteret pandemien, og om hvordan IT understøtter eller står i vejen for indfrielsen af deres bæredygtighedsmål. DigiPlex kan nu dele en rapport med resultaterne fra undersøgelsen samt tanker om, hvordan man håndterer dem. De deler også nogle nyttige tips til, hvordan man skaber en pålidelig infrastruktur, der kan tilskynde til og understøtte ambitioner i den digitale økonomi. Læs mere i rapporten Nordic Data Center Trends 2020: Riding out the Storm.