|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
[JAVA] keyListener su un jpanel
Salve a tutti..allora io ho un jpanel e su di esso voglio mettere un ascoltare di eventi da tastiera..e faccio:
Codice:
this.addKeyListener(new KeyListener()); //this indica il pannello setFocusable(true); Grazie a tutti!! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Invoca requestFocusInWindow sul pannello dopo l'apertura della finestra di cui fa parte.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Allora ho scritto nel pannello:
Codice:
this.requestFocusInWindow(true); Però non li rileva lo stesso.. ![]() |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Anche dopo che appare il pannello non succede niente..non so forse sbaglio a scrivere io qualcosa..Non capisco
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Esempio:
Codice:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Main { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { start(); } }); } private static void start() { final JPanel PANEL = new JPanel(); PANEL.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { System.out.println("key pressed..."); } }); JFrame window = new JFrame("Test"); window.addWindowListener(new WindowAdapter() { public void windowOpened(WindowEvent e) { PANEL.requestFocusInWindow(); } public void windowClosing(WindowEvent e) { e.getWindow().dispose(); } }); window.add(PANEL); window.setSize(400, 400); window.setVisible(true); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Ok..adesso mi da..anche se io avevo già provato prima che mi rispondessi..dando il focus al frame che contiene il pannello..facendo sempre requestFocusInWindow e tutto ciò l'ho messo sempre nel pannello..
Ora è sorto un altro problema che non so se dipende dal fatto che i miei componenti li disegno su un jpanel..In pratica ho un personaggio che deve muoversi a sinistra e lo faccio muovere cosi: Codice:
p.sel=1; //p indica la classe personaggio che selezionando l'indice 1 andrà a prendere l'immagine sinistra del personaggio if(p.getX()>5) for(int i=1;i<=6;i++) p.vaiSinistra(); // dopodichè si muove try { Thread.sleep(40); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } p.sel=0; // adesso prende l'immagine indice 0 di personaggio che sarà l'immagine del pers frontale } |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
E' possibile che incollando il pezzo di codice si siano perse un po' di parentesi? Altrimenti è un algoritmo un po' strano quello che vedo.
p.sel = (0 oppure 1) è quello che "scambia" l'immagine, va benissimo. p.sel = 1, cioè usiamo la figura dell'omino che va sinistra. Poi abbiamo un: se la posizione è maggiore di 5 -vai cinque volte a sinistra: l'immagine è sempre 1. Fatto questo, c'è una pausa di 40ms seguita da un: p.sel = 0, cioè l'immagine corrente dell'omino diventa quella frontale. E' corretto, manca qualche pezzo oppure io non ho capito una mazza?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
si..è proprio cosi'..il codice lo hai interpretato benissimo..Mi scuso per l'ultima parantesi...era la chiusura dell'evento che si rilevava premendo un tasto ..Non l'ho messo io
![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
In pratica..per spiegarmi meglio..L'immagine 1 del personaggio versione sinistra non la visualizza..ma visualizza solo p.sel=0 e cioè l'immagine frontale del personaggio..
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Non dovrebbe invece essere una cosa tipo (pseudo codice):
Codice:
p.sel = 1; //cioè partiamo da sinistra se p.x > 5 { per cinque volte { p.vai a sinistra se p.sel == 0 p.sel = 1 altrimenti p.sel = 0 pausa di 40 millisecondi } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Ho provato..ma niente ancora non da..Ti rimando il codice:
Codice:
if(e.getKeyCode()==KeyEvent.VK_LEFT){ p.sel=1; if(p.getX()>5){ for(int i=1;i<6;i++){ p.vaiSinistra(); if(p.sel==0) p.sel=1; else p.sel=0; try { Thread.sleep(40); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
il metodo vaiASinistra causa l'aggiornamento dell'aspetto dello sprite "p"? Cioè una cosa tipo:
Codice:
public void vaiASinistra() { x--; schermo.repaint(); }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
La cosa strana è che io disegno il mio videogioco e quindi il personaggio in un jpanel..se lo disegno in un jframe il personaggio si muove con le diverse facciate..
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
si..esattamente setta la posizione e dopo invoca repaint..
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Giusto un esperimento (da cancellare subito dopo aver tentato).
Codice:
if(e.getKeyCode() == eccetera) { new Thread() { public void run() { //qui metti tutto quello da p.sel = 1 al catch. } }.start(); } Dovresti però notare altre stranezze rispetto al solo mancato aggiornamento dell'immagine (in particolare un movimento a scatti e uina scarsa reattività della GUI).
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
Ho provato..e adesso funziona
![]() |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Occhio che così generi un thread per ogni keyPressed. Se l'utente tiene premuto un tasto per troppo tempo ti ritrovi con uno tsunami di Thread in esecuzione.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#19 |
Member
Iscritto dal: Dec 2008
Messaggi: 125
|
io uso qst solo per 2 tasti..la freccia destra e sinistra che mi fa muovere il personaggio..Va bene solo per 2 oppure mi creerebbe lo stesso problemi?
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Basta anche un tasto. Se tieni premuto un pulsante - ed è attiva la ripetizione, come normalmente è - il metodo keyPressed viene invocato in rapida successione.
Francamente non saprei dirti se ti convenga o no affrontare il problema. Potresti ad esempio introdurre un campo volatile di tipo boolean da controllare prima di avviare il thread. Tipo: Codice:
private volatile boolean handlingInput = false; public void keyPressed(KeyEvent e) { if(e.getKeyCode() == eccetera) { if(!handlingInput) { handlingInput = true; new Thread() { public void run() { //p.set = 1 //eccetera eccetera handlingInput = false; } }.start(); } } } Poi però ti trovi a dover gestire il caso "è possibile che l'utente debba premere due tasti conteporaneamente?" Se sì allora dovrai avere due booleani handlingInput, uno per tasto. E' fattibile ma aggiunge un certo grado di complessità al programma. Così come aggiunge complessità il fatto che essendo "p" maneggiato da Thread diversi esso dovrebbe essere Thread-Safe. Per il codice che appare è sufficiente che il suo campo set sia dichiarato volatile. Bisogna poi vedere se nel resto del programma ci siano altri interventi concorrenti. Insomma, potrebbero esserci un tot di cosine da sistemare.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:52.