Avatar billede hairball Nybegynder
12. juli 2001 - 13:52 Der er 13 kommentarer og
1 løsning

Flere taster på en gang

Hej

Jeg roder lidt med keyEvents, vist nok på den gamle 1.1. måde, men, anyway

Min kode ser således ud :

public boolean keyDown(Event evt, int key) {   

case Event.LEFT:

    break;
case Event.UP:


    break;
};

Problemet er at det ikke rigtigt trigger hvis man holder både left+up nede på samme tid, så er det kun key man sidst trykker ned den reagerer up.

Nogen der har løsningen ?
Avatar billede delbing Nybegynder
12. juli 2001 - 15:53 #1
umiddelbart vil jeg gætte på, at din kode ikke er indrettet til at kunne håndtere begge hændelser samtidig, dvs. første knap trykkes ned, og dit program går i tilstanden \"første knap\". Senere trykkes anden knap ned, og dette fører til at tilstanden ændres fra \"første knap\" til \"anden knap\".
Det korte af det lange: kan dit program udføre begge ting samtidig?
Avatar billede hairball Nybegynder
12. juli 2001 - 17:45 #2
Er det kun CASE\'en den break\'er eller er det hele SWITCH\'en den hopper ud af ?
Avatar billede hairball Nybegynder
12. juli 2001 - 17:49 #3
Jeg vil gerne som tillæg spørge om hvorfor denne funktion

public boolean keyDown(Event evt, int key) {   

Kun kan ligge i hovedclassen, hvis jeg lægger den i en secondær class kaldes den ikke som ellers ved tryk på en tast ? Hvorfor, og hvad kan jeg gøre ved det ?
Avatar billede delbing Nybegynder
12. juli 2001 - 18:18 #4
1) switchen forlades.

2) Den sekundære klasse skal implementere KeyListener og registreres der hvor eventet kommer fra (dvs den Component med fokus). Det kunne fx se sådan ud hvis den sekundære klasse registrerede sig selv i sin constructor:
componentMedFokus.addKeyListener(this);



Avatar billede delbing Nybegynder
12. juli 2001 - 18:19 #5
keyDown er vist også 1.0?
Avatar billede hairball Nybegynder
12. juli 2001 - 19:42 #6
Hmm.. hvis du gider at lave en lille class til mig, som kan det du beskriver vil jeg være superglad, jeg forstår nemlig ikke heeelt hvad du mener. Jeg er ret ny i java ser du :)
Avatar billede delbing Nybegynder
12. juli 2001 - 20:37 #7
hmm, skal der ikke pumpes nogle flere point i så ;)
Avatar billede delbing Nybegynder
12. juli 2001 - 21:18 #8
ok, et interface er en specifikation hvilke metoder en klasse skal have - hvis en klasse har disse metoder siges den at implementere interfacet, og den implementerende klasse kan så bruges hvor interfacet er specificeret. Fx her, hvor KeyListener interfacet fortæller hvilke metoder der skal bruges, for at et KeyEvent kan \"afleveres\".
Du må kigge i din API for at se hvilke metoder der specificeres i KeyListener i din JDK version og fylde dem ud selv.
Den Component som er i fokus er kilde til fx KeyEvents - det aktive vindue, det tekstfelt kareten står, knappen der trykkes på osv. Men den skal vide hvor den skal sende KeyEvents hen, så derfor tilføjer du en KeyEventListener.

Eksempel:

public class MyKeyListener implements KeyListener {

// constructor som du selv laver - du giver eventkilden med som parameter så listeneren kan registreres.
public MyKeyListener (Component keyEventSource) {
  // registrer listeneren
  keyEventSource.addKeyEventListener(this);

}
public void keyDown(Event evt, int key ) {
  // yadayada
}
}

mere er der ikke til det (pånær småfejl ;)
Det behøver ikke at være i constructoren at MyKeyEventListener registreres, det kan være i en anden metode, eller en helt anden klasse kan registrere den.
Avatar billede hairball Nybegynder
13. juli 2001 - 12:57 #9
Jeg har nu lavet følgende class

import java.applet.*;
import java.awt.event.*;

// ***********************************************************************************************************
// **                                                                                                      **
// **  k e y b o a r d                                                                                      **
// **                                                                                                      **
// ***********************************************************************************************************

public class keyboard implements KeyListener {

// constructor som du selv laver - du giver eventkilden med som parameter så listeneren kan registreres.
  public keyboard (Component keyEventSource) {
  // registrer listeneren
  keyEventSource.addKeyEventListener(this);

  }

  public void keyDown(Event evt, int key ) {
  // yadayada
  }
}


Men når jeg compiler min kode kommer følgende fejl :

\"keyboard.java\": Error #: 300 : class Component not found in class keyboard at line 13, column 20
\"keyboard.java\": Error #: 300 : class Event not found in class keyboard at line 19, column 23
\"keyboard.java\": Error #: 454 : class keyboard should be declared abstract; it does not define method keyReleased(java.awt.event.KeyEvent) in interface java.awt.event.KeyListener at line 10, column 8

Hvordan tilføjer jeg flere point til spørgsmålet ?
Avatar billede hairball Nybegynder
13. juli 2001 - 12:57 #10
Jeg fandt selv ud af det med pointene :)
Avatar billede delbing Nybegynder
14. juli 2001 - 17:50 #11
300: Du har glemt at importere de klasser du bruger. Jeg tror det skal se sådan ud i de første linier:
import java.awt.Component;
import java.awt.event.*;

Ellers kig i den anden klasse du havde efter hvilke imports der laves der, og så kopier dem ind.

454: Når du implementerer et interface skal alle metoderne implementeres - som jeg skrev, kig i API\'en for at se hvilke metoder interfacet har. Her har du så ladet compileren finde den. Tilføj en tom metode hvis du ikke ønsker der skal ske noget specielt når knappen slippes:

public void keyReleased(KeyEvent) {}

Jeg vil tro der er nogle flere metoder som skal implementeres også.
Avatar billede hairball Nybegynder
16. juli 2001 - 15:20 #12

Jeg har disse 2 klasser nu, som begge er hver sin fysiske fil (men det er klasser vel i java?)

Alt hvad der med keyboard at gøre har jeg isoleret i en klasse for sig, for sådan vil jeg gerne have det. Problemet er bare at det ikke virker. Sandsynligvis fordi den anden klasse er \"død\" og derfor ikke registerer tryk på keyboardet. Ligger jeg derimod alt min keyboardkode over i min hovedklasse virker det perfekt. Hvordan får man en subklasse til at reagere på events også ?



import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
import java.util.*;
import java.awt.FontMetrics;

public class tastatur extends Applet implements Runnable
{

    Graphics offscreen;
    Image image;

    static String ord;
 
    Thread runner;
   


    public void init()
    {
       
        keyboard classKeyboard = new keyboard();
       
        classKeyboard.init();

        image = createImage(640,480);
        offscreen = image.getGraphics();

    } // END VOID INIT



    public void start() {
        if (runner == null) {
            runner = new Thread(this);
            runner.start();
        }
    }

    public void stop() {
        if (runner != null) {
            runner.stop();
            runner = null;
        }
    }

public void run(){
    while(true){
      try {
        Thread.sleep(25);
      } catch (InterruptedException e) {
    break;
      }
     
     
      offscreen.drawString(ord,100,100);
     
      repaint();
    }
  }

    public void update(Graphics g){
        paint(g);
    }


    public void paint(Graphics g)

    {



        g.drawImage(image,0,0,this);

    }  // end graphics
   
   
       



} // end class


******************************************************************************

import java.applet.Applet;
import java.awt.event.*;
import java.awt.*;

public class keyboard extends Applet implements KeyListener{
   
   
    public void init()
    {
       
        addKeyListener(this);
    };
   
   
    public boolean isFocusTraversable(){
        return true;
    }

   
    public void keyPressed(KeyEvent e){
   
        String key = e.getKeyChar() + \"\";

        if (key.compareTo(\"e\") == 0){
            tastatur.ord = \"hash\";
        }
       

    }

    public void keyReleased(KeyEvent e){
       
       
   
   
    }

    public void keyTyped(KeyEvent e){}
   
   
}


Avatar billede delbing Nybegynder
16. juli 2001 - 15:35 #13
Du har den næsten der.
Først lige en note: Brug standarderne for store bogstaver osv. Det gør din kode langt nemmere at læse og vedligeholde: se fx http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html#367

keyboard.init(): her sætter du keyboard til at lytte til KeyEvents fra sig selv, det er ikke nødvendigt. keyboard skal lytte til KeyEvents fra tastatur-klassen. Det kan gøres ved at tilføje denne linie i tastatur.init() efter du har instantieret classKeyboard:
addKeyListener(classKeyboard);


(Det kan også gøres sådan, det var det første jeg skrev. Jeg foretrækker egentlig at gøre det som der står herunder, men det ovenover er nemmere:

Lav en constructor i keyboard:

public keyboard(Componont eventSource) {
eventSource.addListener(this);
}


Og der hvor du instantierer keyboard fra tastatur (første linie i tastatur.init()) laver du om til
keyboard classKeyboard = new keyboard(this);
)
Avatar billede hairball Nybegynder
16. juli 2001 - 16:28 #14
Så virker det!

Du havde lavet et par fejl..

Du skrev Componont og ikke Component, den fandt jeg hurtigt :)

Men det hedder ikke eventSource.addListener(this);
men eventSource.addKeyListener(this);

Jeg takker!
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