Uso un listener per disegnare con il mouse su un jpanel ma quando muovo il mouse più velocemente mi arrivano troppo pochi dati.
C'è un modo per aumentare la velocità con cui java notifica gli eventi del mouse?
Uso un listener per disegnare con il mouse su un jpanel ma quando muovo il mouse più velocemente mi arrivano troppo pochi dati.
C'è un modo per aumentare la velocità con cui java notifica gli eventi del mouse?
Coltiva Linux, Windows si pianta da solo!
No. Sono questioni che dipendono dalla tecnologia del mouse (anche di connessione "fisica", es. USB piuttosto che PS/2) e/o forse anche dal driver del mouse.Originariamente inviato da loHacker
C'è un modo per aumentare la velocità con cui java notifica gli eventi del mouse?
In senso generale, dipende dal HW e dal S.O. .... non certo da Java.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho trovato questo programma scritto in java con cui riesco a diesgnare senza problemi, solo che non ho trovato i sorgenti.
Un modo di farlo c'è sicuramente la velocità con cui vengono ricevuti i dati dal mouse è sicuramente più che sufficiente, è il listener che viene notificato troppo lentamente, deve esserci un modo molto più rapido.
Coltiva Linux, Windows si pianta da solo!
Bene. Dimentichiamo un momento le questioni sul mouse ... e inizia a spiegare quale/i listener stai usando, registrati su cosa e quali operazioni e in generale quale approccio di disegno usi.Originariamente inviato da loHacker
è il listener che viene notificato troppo lentamente, deve esserci un modo molto più rapido.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Utilizzo MouseListener, MouseMotionListener su un jpanel, quando il mouse si sposta il metodo mouseDragged provvede a disegnare alle coordinate del mouse.
Per disegnare utilizzo un oggetto Graphics su una BufferedImage.
Ogni volta che disegno un punto viene fatto un repaint del jpanel, forse è quest'ultimo che rallenta il tutto?
Coltiva Linux, Windows si pianta da solo!
OkOriginariamente inviato da loHacker
Utilizzo MouseListener, MouseMotionListener su un jpanel, quando il mouse si sposta il metodo mouseDragged provvede a disegnare alle coordinate del mouse.
Quindi tu disegni prima il punto sulla immagine e poi chiedi il repaint. E successivamente viene invocato il paintComponent() e qui immagino che tu disegni la immagine sul Graphics con uno dei drawImage().Originariamente inviato da loHacker
Per disegnare utilizzo un oggetto Graphics su una BufferedImage.
Ogni volta che disegno un punto viene fatto un repaint del jpanel
L'approccio è corretto. Non è questo il problema. Anzi, devi per forza fare così se vuoi che il disegno fatto dall'utente sia "permanente".
Specialmente se la immagine è molto grande, sì potrebbe essere un problema (e comunque è "relativo" ... dipende anche dal PC).Originariamente inviato da loHacker
forse è quest'ultimo che rallenta il tutto?
Usa innanzitutto uno degli altri repaint, a tua scelta (ma nel tuo caso quasi sicuramente ti è più comodo il secondo).
repaint(Rectangle r)
repaint(int x, int y, int width, int height)
Il cui significato è abbastanza ovvio: la zona "sporca" da ridisegnare non è tutto il componente ma solo una certa "area".
E quando nel paintComponent() farai la drawImage, Swing lo "sa" che la zona da ridisegnare è solo quella area e quindi prenderà dalla immagine solo quella porzione da aggiornare a video.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie ora va molto meglio utilizzando l'altro repaint, ma comunque non riesco ancora a disegnare una linea continua.
Qualche altro consiglio?![]()
Coltiva Linux, Windows si pianta da solo!
Se ti aspetti che muovendo anche velocemente il mouse le notifiche arrivino (e tante) tali da indicare spostamenti di 1 sola unità .... beh, è qui che sbagli.Originariamente inviato da loHacker
ma comunque non riesco ancora a disegnare una linea continua.
E ritorniamo alla questione del mouse, della sua tecnologia, della frequenza di notifica e anche di come è configurata la velocità del puntatore nel sistema.
Se in una frazione di secondo muovi velocemente il mouse, quasi sicuramente non puoi avere tantissime notifiche che indicano spostamenti di 1 pixel!!!
Se vuoi che l'utente possa disegnare una linea "continua", allora è il tuo programma che deve disegnare una linea dal punto precedente al punto corrente. Stai lavorando su Windows? Prendi il famigerato "Paint" di Windows e usa lo strumento "matita". La linea la disegna sempre continua, che tu muova il mouse lentamente o velocemente.
Non è che Paint è migliore riguardo la notifica dal mouse .... no assolutamente! La frequenza di notifica è quella, che sia Paint o un tuo programma Java. Semplicemente Paint disegna una linea da un punto a quello successivo. E se provi a disegnare velocemente un qualcosa di "tondo" vedrai benissimo ad occhio che la linea è segmentata a rette.
Ripeto ancora una volta: non puoi/devi pretendere di ottenere notifiche di spostamenti continui dal mouse. Devi far disegnare delle linee, non c'è altro che puoi fare.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Grazie mille dell'aiuto ora ho capito l'approccio da adottare.![]()
Coltiva Linux, Windows si pianta da solo!