Avatar billede c.a.s.e Nybegynder
17. marts 2001 - 14:29 Der er 8 kommentarer og
1 løsning

Multiple taster trykket

Hejsa,

Jeg er i gang med at lave et mindre bil-spil i Java hvor jeg gerne skulle kunne køre frem og dreje samtidigt. Altså, holde to knapper nede og så detektere dette. Dette kan umiddelbart ikke klares gennem KeyEvent\'s - er der en anden måde at spørge systemet om disse to knapper er trykket ned?

Mvh,
Martin
Avatar billede thums Praktikant
17. marts 2001 - 15:18 #1
hhhmm hvorfor klare du det ikke bare ved at pil op og ned redigere farten.... og pil højre og venstre klare retningen??
Avatar billede c.a.s.e Nybegynder
18. marts 2001 - 23:29 #2
Det kunne jeg nu godt, men forestil dig så at jeg gerne vil kunne lægge miner medens jeg drejer - så skal jeg igen kunne registrere to taster på engang.
Avatar billede thums Praktikant
18. marts 2001 - 23:52 #3
Hmm okay.. så er jeg blank.. :)
Avatar billede starup Nybegynder
27. marts 2001 - 00:56 #4
hvis du bruger en keylistener er der en keyPressed metode og en keyReleased metode.

Når en tast trykkes ned vil keylisteneren køre motoden keyPressed og du sætter en variable der siger at knappen er trykket ned.

Når tasten så slippes igen kører keylisteneren metoden keyReleased og du sætter variablen til at knappen ikke er trykket ned.

Ved at henvise til variablen kan du altid se om knappen er trykket ned.

her er et lille eks:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

// programmet lukkes ikke når framen lukkes,
// da jeg ikke har sat en system.exit(0) på windowclose listeneren
// så bare terminer (CRTL-C) efter endt udførsel

public class keys extends JFrame implements KeyListener
{
    JTextField tf;   
    boolean j = false;  //variable der viser om j holdes nede
    boolean k = false;  //variable der viser om (JA!) k holdes nede
   

    keys()  //constructor opsætter framen med et textfield
    {
        setSize(300,200);
        this.addKeyListener(this);
       
        tf = new JTextField(5);
        tf.setEditable(false);       
       
        JPanel contentPane = (JPanel)this.getContentPane();       
        contentPane.setLayout(new FlowLayout());
        contentPane.add(tf);
    }
   

    public static void main(String[] args)
    {
        new keys ().show ();  //kalder constructoren og viser derefter;
    }
   

    // KeyListener metoder
    public void keyTyped(KeyEvent e)
    {

    }

   
    public void keyPressed(KeyEvent e)
    {
        if (e.getKeyChar() == \'j\') j = true;
        if (e.getKeyChar() == \'k\') k = true;       
        skriv();
    }


    public void keyReleased(KeyEvent e)
    {
        if (e.getKeyChar() == \'j\') j = false;
        if (e.getKeyChar() == \'k\') k = false;       
        skriv();       
    }


    // Skriv til tf
    private void skriv()
    {
        String s = \"\";
        if (j) s = s + \'j\';
        if (k) s = s + \'k\';
        tf.setText(s);
    }
   
}
Avatar billede c.a.s.e Nybegynder
03. april 2001 - 17:28 #5
Men hvis du holder f.eks. \"a\" nede og i medens trykker på f.eks. \"b\", så vil \"a\" rigtig nok blive registreret - det vil \"b\" også. Ydermere vil \"b\" bliver registreret sluppet, men det vil \"a\" aldrig. Prøv bare selv...
Avatar billede starup Nybegynder
04. april 2001 - 08:35 #6
Jeg har prøvet det med ovenstående programstump, og der virker det fint (med tasterne \'j\' & \'k\') uanset hvilken rækkefølge de trykkes og slippes.

Der udløses jo en event for hver tast der trykkes og hver tast der slippes, derfor er rækkefølgen irrelevant, når bare du i dine keylistener metoder tager højde for det, ved at checke hvilken tast, der slippes.

Prøv at compile ovenstående og så teste det med tasterne j & k, som er de eneste taster jeg har taget højde for i mine keylistener-metoder.
Det virker!
Avatar billede c.a.s.e Nybegynder
27. april 2001 - 08:01 #7
Undskyld min lange svartid! Men jeg må konstatere at det virker med det du har skrevet. Men prøver jeg at udvide det med bare een sølle tast mere virker det stadig kun med to. Man kan altså ikke holde tre eller flere taster nede.
Avatar billede c.a.s.e Nybegynder
27. april 2001 - 08:01 #8
Undskyld min lange svartid! Men jeg må konstatere at det virker med det du har skrevet.

Men prøver jeg at udvide det med bare een sølle tast mere virker det stadig kun med to.
Man kan altså ikke holde tre eller flere taster nede.

// c.a.s.e
Avatar billede starup Nybegynder
27. april 2001 - 08:31 #9
Nu har jeg prøvet at udvide programmet med tasterne l&i så programmet understøtter tasterne j,k,l,i og jeg har altså stadig ingen problemer.
Hvis det ikke virker for dig og computeren \'bibber\' når du holder tasterne nede er det fordi at din keyboardbuffer er fyldt.
Her er programstumpen med fire taster:




import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

// programmet lukkes ikke når framen lukkes,
// da jeg ikke har sat en system.exit(0) på windowclose listeneren
// så bare terminer (CRTL-C) efter endt udførsel

public class keys extends JFrame implements KeyListener
{
    JTextField tf;   
    boolean j = false;  //variable der viser om j holdes nede
    boolean k = false;  //variable der viser om k holdes nede
    boolean l = false;  //variable der viser om l holdes nede
    boolean i = false;  //variable der viser om (JA!) i holdes nede

    keys()  //constructor opsætter framen med et textfield
    {
        setSize(300,200);
        this.addKeyListener(this);
       
        tf = new JTextField(5);
        tf.setEditable(false);       
       
        JPanel contentPane = (JPanel)this.getContentPane();       
        contentPane.setLayout(new FlowLayout());
        contentPane.add(tf);
    }
   

    public static void main(String[] args)
    {
        new keys ().show ();  //kalder constructoren og viser derefter;
    }
   

    // KeyListener metoder
    public void keyTyped(KeyEvent e)
    {

    }

   
    public void keyPressed(KeyEvent e)
    {
        if (e.getKeyChar() == \'j\') j = true;
        if (e.getKeyChar() == \'k\') k = true;       
        if (e.getKeyChar() == \'l\') l = true;       
        if (e.getKeyChar() == \'i\') i = true;       
        skriv();
    }


    public void keyReleased(KeyEvent e)
    {
        if (e.getKeyChar() == \'j\') j = false;
        if (e.getKeyChar() == \'k\') k = false;       
        if (e.getKeyChar() == \'l\') l = false;       
        if (e.getKeyChar() == \'i\') i = false;       
        skriv();       
    }


    // Skriv til tf
    private void skriv()
    {
        String s = \"\";
        if (j) s = s + \'J\';
        if (k) s = s + \'K\';
        if (l) s = s + \'L\';
        if (i) s = s + \'I\';
        tf.setText(s);
    }
   
}
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