PDA

Visualizza la versione completa : [java] KeyListener


dekdek
25-02-2005, 15:53
Sto scrivendo una piccola applicazione che simula estrazioni del lotto per imparare i rudimenti della programmazione Java.

Ho provato ad inserire la gestione degli eventi da tastiera ma non capisco bene come fare.

Mi interesserebbe soprattutto pero' capire perche' il programma non funziona nel modo in cui l'ho scritto.

Premesso che avevo usato una sola classe che implementava tutte le interfacce usate, ora ho commentato tutto lasciando soltanto l'addKeyListener nel costruttore e questa classe:




public class ScorciatoieTastiera extends KeyAdapter {
// Implementazione dei metodi di KeyListener

public void keyTyped(KeyEvent e) {
testo.append("\n Pippo: " + Integer.toString(e.getKeyCode()) + " \n");
if (e.getKeyCode()==KeyEvent.VK_S)
vai();
}
}


(testo e' una JTextArea, vai() e' la routine principale)

Ma i metodi non vengono mai eseguiti (provato da Debug)
Se pero' tolgo tutti i Component dell'interfaccia grafica, i metodi (come per magia?) vengono eseguiti, ma ovviamente a video non vedo niente...
Qual'e' il problema? Forse l'evento "tasto premuto" viene associato a qualche componente della GUI?

netarrow
25-02-2005, 15:58
hai fatto da qualche parte nel codice:



...
testo.addKeyListener(new ScorciatoieTastiera());
...


edit:
ah si ora ho visto, l'hai messo nel costruttore, in questo caso non saprei :bh: .


:ciauz:

dekdek
25-02-2005, 16:05
Questa e' la parte di codice del costruttore di cui accennavo:




finestra.add(pulsante);
finestra.add(progresso);
finestra.add(risultati);
finestra.add(barra);
finestra.add(etichettaRipetizioni);
finestra.add(campoRipetizioni);
finestra.add(reset);
finestra.add(inizializza);
finestra.addKeyListener(interagisci2);



Se tolgo tutto (tranne l'ultima riga, ovvio) gli eventi da tastiera vengono gestiti.
I vari componenti sono:




testo = new JTextArea("");
barra = new JScrollPane(testo);
pulsante = new JButton("");
reset = new JButton("Reset!");
etichettaRipetizioni = new JLabel("Numero di estrazioni desiderato");
campoRipetizioni = new JTextField(12);
progresso = new JProgressBar(0,100);
inizializza = new JCheckBox("Inizializza il valore dei ritardi", true);
risultati = new JComboBox(simula.getIntestazioni());

dekdek
25-02-2005, 16:11
Chiedo scusa, l'ultima riga che ho postato e' un mio esperimento per vedere se riuscivo a far funzionare il tutto... Il codice "corretto" (ma non funzionante, cmq) e'





finestra.add(pulsante);
finestra.add(progresso);
finestra.add(risultati);
finestra.add(barra);
finestra.add(etichettaRipetizioni);
finestra.add(campoRipetizioni);
finestra.add(reset);
finestra.add(inizializza);
addKeyListener(interagisci2);



Alla fine il risultato e' lo stesso...

netarrow
25-02-2005, 16:17
Originariamente inviato da dekdek
Chiedo scusa, l'ultima riga che ho postato e' un mio esperimento per vedere se riuscivo a far funzionare il tutto... Il codice "corretto" (ma non funzionante, cmq) e'





finestra.add(pulsante);
finestra.add(progresso);
finestra.add(risultati);
finestra.add(barra);
finestra.add(etichettaRipetizioni);
finestra.add(campoRipetizioni);
finestra.add(reset);
finestra.add(inizializza);
addKeyListener(interagisci2);



Alla fine il risultato e' lo stesso...

in questo caso, a cosa associ addKeyListener?
se ometti l'oggeto ci si riferisce a this, in che classe si trova il codice?

:ciauz:

dekdek
25-02-2005, 16:23
E' la classe principale, quella col main() insomma, a cui ho gia' associato gli ActionEvent e WindowEvent:




public class Lotto extends JFrame

netarrow
25-02-2005, 16:30
finestra quindi cos' un pannello?
non che a console vengono mostrati errori?

potrebbe essere che se il componente a cui associato il KeyLIstener non possiede il focus, non lo esegua.... :master:

:ciauz:

dekdek
25-02-2005, 16:34
finestra per ora e' un semplice Container in cui ficco tutti i componenti.


potrebbe essere che se il componente a cui associato il KeyPressed non possiede il focus, non lo esegua...

Credo sia cosi'. Ho inserito un KeyListener per ogni componente della GUI ed ora funziona...
Non e' una gran bella soluzione pero'... :rollo:

Grazie per l'attenzione, cmq!!! :)

dekdek
25-02-2005, 17:02
Piccola precisazione, ho dovuto cambiare keyTyped in keyPressed, altrimenti getKeyCode mi ritornava sempre zero.

Pero' la soluzione che ho ottenuto non mi piace...

Loading