Avatar billede phineas_phreak Nybegynder
10. juni 2006 - 16:11 Der er 7 kommentarer og
1 løsning

KeyListener igen igen

Hejsa...
Er igang med at lave noget spil i java og skal have vedhæftet en KeyListener. Det der irriterer mig er at man skal vedhæfte listeneren på en JComponent. Jeg var mere interesseret i at få lagt selve listeneren ind i min spil model da det efter min mening gør tingene væsentlig lettere.

Det er bygget op således at jeg har enPlayer class der extender en AI og en Human klasse og ideen var så at smide en listener ind i Human klassen, men human er jo ikke en jcomponent.

Hvordan løser jeg dette ?

på forhånd tak
Avatar billede snoop_one Nybegynder
10. juni 2006 - 16:35 #1
Human klassen skal bare implemtere KeyListener klassen og implementer de respektive metoder.
Du kan også benytte KeyAdapter klassen.
Avatar billede phineas_phreak Nybegynder
10. juni 2006 - 16:46 #2
Burde det så virker når man instansierer et nyt Human objekt ? for det synes jeg, jeg har prøvet, men det ser ik ud til at virke.

Det eneste jeg ka få til at virke er ved at adde en KeyListener til min JFrame f.eks. men det er som sagt ik det jeg ønsker
Avatar billede snoop_one Nybegynder
10. juni 2006 - 16:49 #3
Du kan ikke umiddelbart benytte en keyListener hvis du ikke har gui, da det er det objekt der har fokus der fyre en keyevent af hvis der bliver trykket på tastaturet (observer pattern).
Men du kan flytte din logik ind i din human klasse.
Avatar billede phineas_phreak Nybegynder
10. juni 2006 - 16:53 #4
Jeg har følgende:

public class Human extends Snake {
   
    public Human() { }
   
   
    class KListener implements KeyListener {
       
        private Human h;
       
        public KListener(Human h) {
            this.h = h;
        }
       
        public void keyTyped(KeyEvent k) {
            // This method is intentionally left empty
        }

        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();
           
            // directions: N=0, E=1, S=2, W=3
            switch(key) {
            case KeyEvent.VK_LEFT:
                System.out.println("Player 1 west");
                break;
            case KeyEvent.VK_RIGHT:
                System.out.println("Player 1 east");
                break;
            case KeyEvent.VK_UP:
                System.out.println("Player 1 north");
                break;
            case KeyEvent.VK_DOWN:
                System.out.println("Player 1 south");
                break;
            case KeyEvent.VK_A:
                System.out.println("Player 2 west");
                break;
            case KeyEvent.VK_D:
                System.out.println("Player 2 east");
                break;
            case KeyEvent.VK_W:
                System.out.println("Player 2 north");
                break;
            case KeyEvent.VK_S:
                System.out.println("Player 2 south");
                break;
            }
        }

        public void keyReleased(KeyEvent arg0) {
            // This method is intentionally left empty
           
        }
    }
}


Og nu ønsker jeg fra et andet sted i min model at oprette et Human objekt.

Jeg har selvfølgelig en GUI der i sidste ende er blevet bygget op omkring modellen. Men hvordan knytter jeg det her sammen ?
Avatar billede snoop_one Nybegynder
10. juni 2006 - 16:57 #5
public class Human implements KeyListener {
   
    public Human(){}
   
    public static void main(String[] args) {
        JFrame frame = new JFrame("Human Tester");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(new Human());
        frame.setVisible(true);
    }

    public void keyTyped(KeyEvent event) {
        System.out.println(event.getKeyChar());
    }

    public void keyPressed(KeyEvent evnet) {
    }

    public void keyReleased(KeyEvent event) {
    }
}
Avatar billede snoop_one Nybegynder
10. juni 2006 - 17:00 #6
I dit tilfælde har du oprettet en keylistener object som indre klasse i din human klasse. Dvs. din human klasse indeholder en anden klasse. Dette er i dette tilfælde ret unødvendigt... Indreklasser benyttes som f.eks. hjælp klasser der ikke er berettiget til at stå alene eller hvis man evt. ønsker kode reuse iht. multiple inheritance.
Avatar billede phineas_phreak Nybegynder
11. juni 2006 - 23:41 #7
Så fandt jeg ud af det. Det var ik helt måden jeg kunne tænke mig, da man stadig ik kommer uden om at adde KeyListeneren til JFramen, men du skal ha tak for hjælpen, så smid et svar og få nogle point
Avatar billede snoop_one Nybegynder
12. juni 2006 - 09:47 #8
svar :)
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
Kategori
Kurser inden for grundlæggende programmering

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