[JAVA] KeyListener werkt niet Thread

Pagina: 1
Acties:

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 15-09 23:09
Ik heb een KeyListener in een Class die Thread extendt zitten.
Deze thread wordt geinstantieerd in een Class2.
Deze Class2 wordt aangeroepen door in ActionEvent methode van een button in Class1.
Nu pakt hij de KeyListener van de thread niet.
Hoe kan dat?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.lang.Thread;
import java.awt.event.*;
import java.awt.*;

public class tijdThread extends Thread implements KeyListener
{
  TypePanel typepanel;
  int timeleft;
  private char ch;

  private String textToType;
  private boolean typoMade, notFinished;
  private int charpos,charsleft;
  private Label typelabel = new Label();

  public tijdThread(TypePanel typepanel, int timeleft, String textToType)
  {
  System.out.println("hij zit in de constructor nu");
  this.typepanel=typepanel;
  this.timeleft=timeleft;
  this.textToType=textToType;
  typelabel.setBounds(new Rectangle(36, 153, 544, 30));
  typelabel.setFont(new java.awt.Font("Monospaced", 0, 25));
  typelabel.setText(textToType);
  typepanel.add(typelabel);
  typepanel.setEnabled(true);
  typelabel.addKeyListener(this);
  typelabel.requestFocus();
  System.out.println(typelabel.getText());
  charsleft=textToType.length();
  }

  public void keyTyped(KeyEvent ae) {
  System.out.println("key getypt");
/*  ch = e.getKeyChar();
  if (ch!=textToType.charAt(0)) {typoMade=true;}
  else {
    textToType=textToType.substring(1,textToType.length());
    typepanel.updateTypelabel();
    }*/
  }

  public void keyPressed(KeyEvent ae) {
  System.out.println("test");
  }

  public void keyReleased(KeyEvent ae) {
  }

    void updateTypelabel()
  {
  charsleft--;
  typelabel.requestFocus();
  typelabel.setText(textToType.substring(0,charsleft));
  if (charsleft==0)
    {
    }
  }


  public void run()
  {
  typelabel.addKeyListener(this);
  System.out.println("Bezig met runnen thread");
  for (int a=1; a<1000; a++)
  {
  try {
    Thread.sleep(400);
    }
    catch (InterruptedException exc)
    {System.out.println("Sleep Exception");
    }
  typepanel.trigger();
  }
  }
}

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Disclaimer naar aanleiding van eerder topic: zie mijn opmerkingen als opbouwende kritiek :) . Ik probeer je stijl te verbeteren. Ik tik natuurlijk geen opmerkingen voor m'n lol :) .
Mastermind: Class2, Class1
Ik hoop dat die in het echt anders heten? Zo niet, dan zou ik vooral eerst eens duidelijke klasse-namen gaan verzinnen. Dat is niet alleen omdat het zo 'hoort', maar het werkt voor jezelf ook een stuk beter. Als je de zaken goed benoemt leer je bovendien beter om klassen in je code te onderscheiden: als je iets geen naam geeft (dit beschouw ik maar even als geen naam) kan je natuurlijk nooit onderscheiden wat je gekozen hebt :) .
Deze thread wordt geinstantieerd in een Class2. Deze Class2 wordt aangeroepen door in ActionEvent methode van een button in Class1.
Je hebt dus een button die aangemaakt wordt in 'Class1'. 'Class2' is een ActionListener die is aangemeld op deze button.

De methode actionPerformed maakt een nieuwe Thread aan. Deze Thread is ook KeyListener.

Vraag: waarop wil je de KeyListener aanmelden?
Nu pakt hij de KeyListener van de thread niet.
Hoe kan dat?
Ik neem aan dat de methoden van de KeyListener dus niet wordt aangeroepen zoals je verwacht?

Dat kan hierdoor komen:
code:
1
typelabel.addKeyListener(this);

Je meldt je KeyListener aan op een Label. Dat kan op zich wel, maar je moet goed uitkijken dat de focus dan niet per ongelijk in een ander component staat. Is het niet handiger om met buttons te werken? Het is sowieso niet erg logisch voor een gebruiker om in een Label een toets in te moeten drukken...
public class tijdThread
Het is ook wel goed om klassen met hoofdletters te beginnen en consequent te kiezen voor Engels of Nederlands. Als je programma groter wordt moet je anders steeds opzoeken of je nu ook alweer Engels of Nederlands had gebruikt en wat voor hoofdletter-patroon je had gekozen....

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 15-09 23:09
Op dinsdag 15 januari 2002 02:25 schreef mbravenboer het volgende:
Disclaimer naar aanleiding van eerder topic: zie mijn opmerkingen als opbouwende kritiek :) . Ik probeer je stijl te verbeteren. Ik tik natuurlijk geen opmerkingen voor m'n lol :) .
[..]
Nee ik vind het wel fijn dat je me op dingen wijst.
Ik hoop dat die in het echt anders heten? Zo niet, dan zou ik vooral eerst eens duidelijke klasse-namen gaan verzinnen. Dat is niet alleen omdat het zo 'hoort', maar het werkt voor jezelf ook een stuk beter. Als je de zaken goed benoemt leer je bovendien beter om klassen in je code te onderscheiden: als je iets geen naam geeft (dit beschouw ik maar even als geen naam) kan je natuurlijk nooit onderscheiden wat je gekozen hebt :) .
[..]
Uiteraard heten die klassen gewoon MenuPanel, GameApplet, TypingPanel etc.
Je hebt dus een button die aangemaakt wordt in 'Class1'. 'Class2' is een ActionListener die is aangemeld op deze button.

De methode actionPerformed maakt een nieuwe Thread aan. Deze Thread is ook KeyListener.
de structuur is als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GameApplet
     |heeft
     |
mainPanel
     |hierop wordt geadd
MenuPanel
     |heeft een startButton
     |en die opent TypingPanel door een methode  
     |openTypingPanel in GameApplet aan te roepen
     |Waarom daar? Omdat die GameApplet de mainPanel heeft.
TypingPanel
     |De MenuPanel wordt setVisible(False gedaan) en   
     |TypingPanel setVisible(true)
     |deze TypingPanel start een thread genaamd
tijdThread
     |Deze is gefocust op een label. Dit wil, want dit heb
     |ik wel vaker gedaan. Alleen deze KeyEvent pakt ie niet.
Vraag: waarop wil je de KeyListener aanmelden?
[..]

Ik neem aan dat de methoden van de KeyListener dus niet wordt aangeroepen zoals je verwacht?
De methoden van de KeyListener worden idd niet aangeroepen, terwijl ik hem wel geimplementeerd heb en aan het label toegevoegd.
Dat kan hierdoor komen:
code:
1
typelabel.addKeyListener(this);

Je meldt je KeyListener aan op een Label. Dat kan op zich wel, maar je moet goed uitkijken dat de focus dan niet per ongelijk in een ander component staat. Is het niet handiger om met buttons te werken? Het is sowieso niet erg logisch voor een gebruiker om in een Label een toets in te moeten drukken...
[..]
Bij dit typespelletje moet de focus op de label staan, dat is de te typen tekst. Hier komt een actie op dat de label veranderd wordt.
Deze typelabel krijgt de focus met typelabel.requestFocus(); de normale gang van zaken dus.
Het is ook wel goed om klassen met hoofdletters te beginnen en consequent te kiezen voor Engels of Nederlands. Als je programma groter wordt moet je anders steeds opzoeken of je nu ook alweer Engels of Nederlands had gebruikt en wat voor hoofdletter-patroon je had gekozen....
I know, maar dit was een typefoutje. :)

Zo, nu duidelijk? :)
Waarom leest die het toetsenbord niet uit? Het lijkt erop of hij zich nog steeds bezig houdt met de startknop in het MenuPanel.