Java keylistener

Status
Niet open voor verdere reacties.

JohnnyReinders

Gebruiker
Lid geworden
2 mrt 2011
Berichten
118
Java keylistener werkt niet!

Hallo allemaal,

Ik ben bezig met het leren van java game programmering, maar nu wil ik eerst een klein 2d spelletje maken waarin je kan lopen etc. Maar als ik op Google kijk voor een tutorial over keybindings dan kan ik die nergens vinden. Ik heb ook al in de sun documentatie gekeken maar daar kon ik niet veel mee omdat de site zo onoverzichtelijk is.

Dus als iemand mij het hier, in een paar kleine stappen zou kunnen uitleggen hoe een keylistener werkt en hoe je die in je app zet, dan zou ik daar heel blij mee zijn.

Mvg. Johnny Reinders
 
Laatst bewerkt:
Beste Johnny,

De oracle site heeft hier een redelijk duidelijk voorbeeld-programma over gemaakt: http://download.oracle.com/javase/t...EventDemoProject/src/events/KeyEventDemo.java

Zorg ervoor dat je klasse implements KeyListener heeft.
Code:
public class HelpmijPuntNl implements KeyListener {

Als men dan op een toets drukt, wordt de volgende methode aangeroepen. (Dit is een van de methoden die je moet implementeren, omdat je van de klasse KeyListener erft).

Code:
public void keyPressed(KeyEvent e)

Hierin zul je dus een check moeten maken om te kijken welke toets wordt ingedrukt. Daarna kan je de positie van het te bewegen object veranderen.

Code:
public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
        //De linker pijltjestoets is nu ingedrukt
              personage.moveLeft();
         }

Hopelijk helpt dit een beetje.

M.v.g.
NewbiProgr
 
Laatst bewerkt:
Eey bedank voor de duidelijke uitleg, ik zal binnen kort ff kijken of het lukt.

Edit het is nog niet gelukt, ik heb het geprobeert om een text te laten weergeven als text, met System.out.printIn()
maar dat werkte niet kreeg error, komt dat omdat ik nog geen window heb? die keylistgener werkt tog alleen met window?

Edit²

Dit is wat ik nu heb om te testen.:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package test;

/**
*
* @author Administrator
*/
public class Main implements KeyListener {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.printIn("Hello");
}

}

En ik krijg de error.:
run:
java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: class KeyListener
at test.Main.<clinit>(Main.java:12)
Could not find the main class: test.Main. Program will exit.
Exception in thread "main" Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)

zou je kunnen kijken waar het aan licht, ik ben net 2 dagen bezig met java dus, en wil het heeel graag leren.
 
Laatst bewerkt:
Wat er in ieder geval fout aan je code is dat je niet de methodes van de keylistener hebt geïmplementeerd. Op het moment dat je in de header van de class implements KeyListener ben je verplicht de de volgende methoden in je klasse te zetten:
Code:
public void keyPressed(KeyEvent k) {}
public void keyReleased(KeyEvent k) {}
public void keyTyped(KeyEvent k) {}
 
Wat er in ieder geval fout aan je code is dat je niet de methodes van de keylistener hebt geïmplementeerd. Op het moment dat je in de header van de class implements KeyListener ben je verplicht de de volgende methoden in je klasse te zetten:
Code:
public void keyPressed(KeyEvent k) {}
public void keyReleased(KeyEvent k) {}
public void keyTyped(KeyEvent k) {}
moeten deze voids ook nog iets bevatten ofzo iets als setText ofzo?
 
Als je ze niet gebruikt mag je ze gewoon leeg laten.

Ik zou de keypressed wel invullen met wat ik in mijn eerste post heb gezegd.

Dit omdat zoals de namen al aangeven de KeyPressed wordt aangeroepen als er op een toets wordt gedrukt, de keyReleased wordt aangeroepen als er een toets wordt losgelaten

Ik denk dat de error ontstaat doordat je de KeyListener niet import. Bovenin de klasse dus nog even de imports toevoegen.
Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener

*Tip als je een IDE als Eclipse gebruikt om de programma's te schrijven wordt je op fouten, imports etc gewezen.
(http://nl.wikipedia.org/wiki/Integrated_development_environment)
 
Laatst bewerkt:
Oke, ik maak gebruik van netbeans die geeft het ook aan maar steets als ik dan import dan komt er weer nieuwe errors maar volgens mij kom ik nu aardig in de goeierichting alleen valt mijn computer steets uit en moet ik weer opzoeken waar ik was en af en toe opnieuw typen maar daar leer ik weer van ;)
 
Waarom sluit mijn app niet af als ik op de linker cursor toets druk zoals is opgegeven in de volgende code? Ligt het aan de focus? die heb ik aan.


Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;



public class MyFirstJFrameWindow
        implements KeyListener
{
    public static void main(String args[])
    {
        JFrame Window = new JFrame("My first JFrame Window!");
        Window.setLocation(200,100);
        Window.setSize(800,600);
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setVisible(true);
        Window.setFocusable(true);
    }

    public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_LEFT)
        {
            System.exit(0);
        }
    }

    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

   

    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
 
Laatst bewerkt:
Zo werkt het.
Code:
package test;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class MyFirstJFrameWindow 
        implements KeyListener
{
	public MyFirstJFrameWindow() {
	JFrame Window = new JFrame("My first JFrame Window!");
        Window.setLocation(200,100);
        Window.setSize(800,600);
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setVisible(true);

        [B]Window.addKeyListener(this);[/B]
	}
	
    public static void main(String args[])
    {
        new MyFirstJFrameWindow();
    }
    public void keyPressed(KeyEvent e)
    {
       if(e.getKeyCode() == KeyEvent.VK_LEFT) {
    	   System.exit(0);
       }
    }

    public void keyTyped(KeyEvent e) { }

   

    public void keyReleased(KeyEvent e) { }
}
 
Jeaaaaaaah, Hij werkt, Echt Hardstikke bedankt, heb er weer wat van geleert, nogmaals bedankt ;)
 
om wat tijd te besparen kan je mischien nog wel een package(folder) en daarin je input van je toetsenbord doen:

Code:
public class input implements KeyListener{
public boolean toetsen[] = new boolean[*aantal toetsen*]
private final int OMHOOG = 1;
private final int OMLAAG = 2;
private final int RECHTS = 3;
private final int LINKS = 4;

public void set(int toets, boolean b){
int button = -1;	
	
	if(key == KeyEvent.VK_UP) button = OMHOOG;
	if(key == KeyEvent.VK_DOWN) button = OMLAAG;
	if(key == KeyEvent.VK_LEFT) button = LINKS;
	if(key == KeyEvent.VK_RIGHT)button = RECHTS;

	
	if(button >= 0){
		keys[button] = true;
	}
}
}

voeg daarna in je keypressed methode de set() in: voorbeeld:

Code:
public void KeyPressed(KeyEvent e){
set(e.getKeyCode(),TRUE);
}
en bij released precies het zelfde maar dan false, ik hoop dat ik je heb geholpen :)!
 
Bedeol je dat ik dan inplaats van vk_... alleen ... hoef te typen?
Mischien dat ik het nog wel ga gebruiken, Bedankt in ieder geval.
 
wat je dus eigenlijk doet in je
private final int OMHOOG = 1;
hiermee zet je OMHOOG gelijk aan 1.
de set methode plaats je dus in je keypressed, de e.getKeyCode() returned de int van de key die je intikt: elke toets heeft een int.
dus stel: je hebt pijltje omlaag ingeklikt dit returned de int 107 ( voorbeeld )
de set() methode heeft dus 109 als key
dus set() gaat kijken of 109 ergens gelijk aan is in de if statements.
omdat pijltje omlaag dus 109 is . is 109 gelijk aan VK_DOWN. omdat 109 = 109 loop je door de if statement en is de boolean(OMHOOG) true;
dus stel je wilt checken of omhoog true is doe je: if(input.toetsen[OMHOOG]){}

ik hoop dat dit voor je werkt
 
Aha, nu snap ik het, Denk dat als ik een beetje grote programmas wil maken gaan dat ik dit script zeker ga gebruiken, Bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan