Avatar billede jmahle Nybegynder
12. april 2005 - 11:25 Der er 11 kommentarer

Keyboard listener af en slags?

Hej eksperter

Jeg har et spørgsmål, angående om det er muligt at lave en eller anden form for listener, der står og looper hele tiden i ens program. Hvis man så trykker f.eks. "P" på sit tastetur, så skal programmet gå i en anden tilstand, f.eks. pause-tilstand...

Altså om det er muligt at stå og "lytte" på tasteturet og opfange, hvis man f.eks. trykker P....?

Mvh Jacob
Avatar billede dbangx Nybegynder
12. april 2005 - 11:53 #1
selvfølgelig...

Ved ikke om det er den korekte metode, men det jeg har gjort tidligere er at lave en implementation af KeyAdapter klassen og lade den override en af metoderne: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/event/KeyAdapter.html

skriv koden i metoden for hvad programmet skal gøre. Husk at teste på argumentet om det er den rigtige knap der er trykket på.

tilføj din implementation til alle de visuelle elementer, der kan have fokus på skærmen med metoden addKeyListener(dinimplementation);
Avatar billede snoop_one Nybegynder
12. april 2005 - 11:57 #2
Ja, men normalt vil man sætte programmet op til at give besked når der bliver trykket på f.eks. P. Dette kan du gøre ved med en KeyListener.
Avatar billede dbangx Nybegynder
12. april 2005 - 12:12 #3
KeyListener og KeyAdapter er 2 sider af samme sag. implementerer du listeneren skal du implementere alle tre metoder, mens med en extension af adaptoren kan du nøjes med de metoder du er mest interesseret i.

eksempel med adaptoren:
public class a extends KeyAdapter {

    public void keyReleased(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_P) {
            // hvad skal der ske?
        }       
    }
}

eksempel med listeneren:
public class b implements KeyListener {

    public void keyTyped(KeyEvent arg0) {

    }

    public void keyPressed(KeyEvent arg0) {

    }

    public void keyReleased(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_P) {
            // hvad skal der ske?
        }
    }
}

det smarte ved adaptoren er blot at vi sparer de to ekstra metoder væk, hvilket giver et bedre overblik og mindre forvirring.

hvis du har en tekstbox eksempelvis du vil have til at lytte efter tastetryk på p, så skriver du bare:

JTextField text = new JTextField();
text.addKeyListener(a / b); alt efter hvilken løsning du kan lide
Avatar billede snoop_one Nybegynder
12. april 2005 - 12:30 #4
Helt enig med dbangx, adaptoren er der for at spare dig for at implementere nogle metoder som du nok alligevel ikke får brug for. Dog ville jeg nok have anvendt annonyme klasser istedet for at lave en klasse.

f.eks.

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

public class Keytest {
    public static void main(String... args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("Du trykkede på "+e.getKeyChar());
            }
        });
        frame.setVisible(true);
    }
}
Avatar billede jmahle Nybegynder
12. april 2005 - 12:43 #5
ok tak, ser rigtig fint ud.

Lige et sidste "dummy" spørgsmål. Det er ikke muligt at lytte efter tastetryk uden at have f.eks. et JTextField eller noget lign.? Gruden er at jeg ikke har noget som helst  GUI, men kun et dos-vindue hvor mit program kører?

Det er fordi jeg roder lidt med at lave et simpelt skak program, og der benytter jeg java's Robot klasse til at flytte musen rundt på skærmen, men når musen hele tiden bliver flyttet, ville det være rart hvis man kunne lytte efter et bestemt tastetryk, så jeg kunne få programmet til stadig at køre, men ikke flytte med musen f.eks...
Avatar billede dbangx Nybegynder
12. april 2005 - 12:43 #6
Ja det er i mange tilfælde godt, men framen opfanger ikke tastetrykkene, da framen ikke har den primære focus. Det er det component der har focus, der fyrer sin events af til sin keylistener, ikke framen. Det vil sige at hvis du har bare fem componenter på skærmen, der kan have focus, så skal du skrive den samme kode 5 gange, det var derfor jeg lavede det som en klasse.

Hvis man gerne vil holde det samlet så kan du lave den som en nested klasse.

public class Keytest {
    public static void main(String... args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addKeyListener(new a());
        frame.setVisible(true);
    }
}
private class a extends KeyAdapter{
    public void keyPressed(KeyEvent e) {
              System.out.println("Du trykkede på "+e.getKeyChar());
            }


}
Avatar billede dbangx Nybegynder
12. april 2005 - 12:48 #7
fandt en lille statisk metode, der læser en Streng fra konsollen:

/**
    * read a string from the console. The string is
    * terminated by a newline
    * @return the input string (without the newline)
    */
   
  public static String readString()
  {  int ch;
      String r = "";
      boolean done = false;
      while (!done)
      {  try
        {  ch = System.in.read();
            if (ch < 0 || (char)ch == '\n')
              done = true;
            else
              r = r + (char) ch;
        }
        catch(java.io.IOException e)
        {  done = true;
        }
      }
      return r;
  }


Du kan bare returnere efter en char.

Hvis du skal lytte efter taste tryk ville det måske være smart at lave det i en tråd.
Avatar billede snoop_one Nybegynder
12. april 2005 - 13:17 #8
dbangx -> det med focus er helt korrekt :) det var også et eksempel...

Men hvis du køre java 1.5 kan du benytte dig af scanner klassen...
Et lille eksempel:

import java.util.Scanner;

public class KeyCommandListener extends Thread {
    public static void main(String... args) {
        new KeyCommandListener().start();
    }

    public void run() {
        Scanner inputscanner = new Scanner(System.in);
        while (true) {
            String input = inputscanner.next();
            if (input.equals("q")) {
                System.out.println("Input: " + input+" - Afslutter programmet");
                System.exit(0);
            } else {
                System.out.println("Input: " + input);
            }
        }
    }
}
Avatar billede dbangx Nybegynder
12. april 2005 - 13:21 #9
Scanneren har jeg ikke set før. det er ellers smart :-)
Avatar billede jmahle Nybegynder
12. april 2005 - 17:13 #10
Tak begge to... ser rigtig godt ud  :)
Avatar billede snoop_one Nybegynder
11. juni 2005 - 10:46 #11
lukke tid?
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