Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-05-2009, 20:50   #1
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
[Java]Coda eventi AWT, listener personalizzati e effetti immagini

ciao!!

come al solito torno a rompere a voi che ne sapete di Java

prima di tutti ringrazio PGI-Bis per avermi aiutato nell'altro thread

ma ora passiamo al nuovo problema (trattato più o meno nell'altro 3d) la coda eventi awt.

premetto che io devo realizzare un programma che gestisce un multitouch, quindi mi servono eventi personalizzati visto che posso gestine un numero n di "dita".

detto ciò il mio dubbio è su come mettere un evento nella queue di awt e come dire a un componente di restare in ascolto per quell'evento!

qualcuno mi può dire come si fa?
ho intravisto un oggetto eventqueue nelle api, ma non mi è chiaro come funzioni


detto questo passiamo a una domandina "secondaria" in java posso creare effetti tipo il blur e lo sfocamento di immagini in modo semplice? sarebbe bello implementarli nel menu

grazie a tuttttti!

PS. PGI-Bis fai parte di qualche team? che il tuo avatar l'ho già visto in siti che ho girato per recuperare informazioni
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 17:15   #2
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
uppp! please help me!
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 19:08   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Nel mio logo c'è Duke, la mascotte di Java. Ah, infedele, non l'hai riconosciuto!

Infilare eventi nella coda degli eventi è una questione di poche righe:

EventQueue systemQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
systemQueue.postEvent(un qualsiasi evento AWT);

Se crei una classe che estende ad esempio MouseEvent (per un multitouch potrebbe essere una classe identica a MouseEvent salvo il fatto che indica anche quale "mouse" abbia prodotto l'evento, esistendone più d'uno), crei un'istanza e la "posti" nella coda degli eventi AWT quell'evento viene propagato quasi come fosse un evento del mouse di sistema.

Questo ti permette di catturarlo con un normalissimo MouseListener.

Esempio:

Codice:
import java.awt.*;
import java.awt.event.*;

public class Main {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Main().start();
			}
		});
	}
	
	private volatile boolean execute = true;
	private final Frame window = new Frame("Custom Mouse Event Generation");
	private final int MOUSE_1 = 0;
	private final int MOUSE_2 = 1;
	
	private void start() {
		
		window.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				if(e instanceof CustomMouseEvent) {
					System.out.println("Evento del mouse numero " + ((CustomMouseEvent)e).getMouseId());
				}
			}
			
			public void mouseReleased(MouseEvent e) {
				if(e instanceof CustomMouseEvent) {
					System.out.println("Evento del mouse numero " + ((CustomMouseEvent)e).getMouseId());	
				}
			}
		});
		window.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				window.dispose();
				stopMouseEventProducer();
			}
			
			public void windowOpened(WindowEvent e) {
				startMouseEventProducer();
			}
		});
		
		window.setSize(400, 400);
		window.setVisible(true);
		
	}
	
	private void startMouseEventProducer() {
		Runnable task = new Runnable() {
			public void run() {
				while(execute) {
					Component source = window;
					CustomMouseEvent mouse1Event = new CustomMouseEvent(
						source,
						MouseEvent.MOUSE_PRESSED,
						MouseEvent.BUTTON1_DOWN_MASK,
						100,
						100,
						1,
						MouseEvent.BUTTON1,
						MOUSE_1);
					CustomMouseEvent mouse2Event = new CustomMouseEvent(
						source,
						MouseEvent.MOUSE_RELEASED,
						MouseEvent.BUTTON1_DOWN_MASK,
						100,
						100,
						0,
						MouseEvent.BUTTON1,
						MOUSE_2);						

					EventQueue systemQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
					systemQueue.postEvent(mouse1Event);
					systemQueue.postEvent(mouse2Event);
					try {
						Thread.sleep(2000);
					} catch(InterruptedException ex) {
						execute = false;
						return;
					}
				}
			}
		};
		new Thread(task).start();
	}
	
	private void stopMouseEventProducer() {
		execute = false;
	}
}

class CustomMouseEvent extends MouseEvent {
		private final int screenX, screenY, mouseId;

		public CustomMouseEvent(Component source, int id, int modifiers, int x, int y, int clickCount, int button, int mouseId) {
			super(source, id, System.currentTimeMillis(), modifiers, x, y, clickCount, false, button);
			screenX = x;
			screenY = y;
			this.mouseId = mouseId;
		}
		
		public int getMouseId() {
			return mouseId;
		}
		
		private Point getSourceLocationOnScreen() {
			return getComponent().getLocationOnScreen();
		}
		
		public Point getLocationOnScreen() {
			return new Point(screenX, screenY);
		}
		
		public Point getPoint() {
			Point componentLocationOnScreen = getSourceLocationOnScreen();
			return new Point(componentLocationOnScreen.x + screenX, componentLocationOnScreen.y + screenY);
		}
		
		public int getX() {
			return getSourceLocationOnScreen().x + screenX;
		}
		
		public int getY() {
			return getSourceLocationOnScreen().y + screenY;
		}
		
		public int getXOnScreen() {
			return screenX;
		}
}
Questa roba qua stampa due scritte attraverso un MouseListener su Window. L'evento che genera la stampa è un MouseEvent personalizzato.

C'è un piccolo problema con gli eventi semantici (tipo ActionEvent). Questi eventi sono generati da eventi di basso livello (MouseEvent è un evento di basso livello). Il problema è che non sembra che eventi di basso livello personalizzati siano in grado di generare eventi semantici. Bisognerebbe spulciare un po' i sorgenti di OpenJDK per capire come mai.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 19:17   #4
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071


grazie mille per il codice, me lo guarderò con calma

il mio awtevent personalizzato deve avere particolari caratteristiche?

questo è il codice che ho provato a fare alla veloce e fa una cosa strana:
Codice:
EventQueue queue=Toolkit.getDefaultToolkit().getSystemEventQueue();
		
		MyAWTEvent event=new MyAWTEvent(new String("sourceasd"), 10);
		queue.postEvent(event);
		
		while(true){
			AWTEvent e;
			try {
				e = queue.getNextEvent();
				if(e instanceof MyAWTEvent){
					String source=(String)(e.getSource());
					System.out.println(source);
					break;
			}
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			
		}
se faccio così mi inserisce il mio evento e mi stampa suourceasd come ci si apetterebbe, ma se commento il while mi da un errore: unable to dispatch: (il mio awtevent)

PS myAWTEvent è solo un'implementazione di AWTEvent che non gli aggiunge nulla:
Codice:
public class MyAWTEvent extends AWTEvent {
	public MyAWTEvent(Object arg0, int arg1) {
		super(arg0, arg1);
	}
}
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 19:33   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
L'errore ha una traccia o da solo quel messaggio? Comunque fai una cosa strana, in pratica immetti l'evento nella coda e poi inizi a consumarla parallelamente all'Event Dispatcher Thread.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 19:43   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per il blur se hai sotto mano un BufferedImage puoi applicare una convoluzione (ConvolveOp) e poi la applichi come un filtro (BufferedImage blurred = convolution.filter(source, null));
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2009, 19:53   #7
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
L'errore ha una traccia o da solo quel messaggio? Comunque fai una cosa strana, in pratica immetti l'evento nella coda e poi inizi a consumarla parallelamente all'Event Dispatcher Thread.
era solo per vedere se c'era il mio evento dentro, ma se faccio solo il post non funziona...
ecco cosa dice la console:
unable to dispatch event: MyAWTEvent[] on sourceasd

è system.err.....

grazie per il blur
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 00:18   #8
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
tu hai fatto un esempio con mouse move, ma se lo volessi fare con actionevent e lo ascolta un awteventlistener?
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 00:23   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
ActionEvent è uno degli eventi semantici di cui parlavo. In pratica un pulsante rileva un MouseReleased su sè stesso e per tutta risposta spara un ActionEvent.

Il fatto è che se spariamo un MouseReleased nella coda avente come bersaglio il pulsante lo stesso non genera un ActionEvent. E non dovrebbe fare così

O l'evento che genera un ActionEvent non è un MouseReleased (non ho provato con MouseClicked o con una coppia MousePressed-MouseReleased entro un certo intervallo di tempo) o deve avere una sorgente particolare. Sono quelle cose che andrebbero verificate nei sorgenti di Java perchè non sono comportamenti documentati.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 10:59   #10
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
ActionEvent è uno degli eventi semantici di cui parlavo. In pratica un pulsante rileva un MouseReleased su sè stesso e per tutta risposta spara un ActiveEvent.

Il fatto è che se spariamo un MouseReleased nella coda avente come bersaglio il pulsante lo stesso non genera un ActionEvent. E non dovrebbe fare così

O l'evento che genera un ActionEvent non è un MouseReleased (non ho provato con MouseClicked o con una coppia MousePressed-MouseReleased entro un certo intervallo di tempo) o deve avere una sorgente particolare. Sono quelle cose che andrebbero verificate nei sorgenti di Java perchè non sono comportamenti documentati.
allora credo di aver spulciato un pò il sorgente di eventqueue (http://www.docjar.com/html/api/java/...ueue.java.html) e il system.err unable to dispatch c'è solo nel metodo dispatchEvent:

Codice:
protected void dispatchEvent(AWTEvent event) {
  596           event.isPosted = true;
  597           Object src = event.getSource();
  598           if (event instanceof ActiveEvent) {
  599               // This could become the sole method of dispatching in time.
  600               setCurrentEventAndMostRecentTimeImpl(event);
  601   
  602               ((ActiveEvent)event).dispatch();
  603           } else if (src instanceof Component) {
  604               ((Component)src).dispatchEvent(event);
  605               event.dispatched();
  606           } else if (src instanceof MenuComponent) {
  607               ((MenuComponent)src).dispatchEvent(event);
  608           } else if (src instanceof TrayIcon) {
  609               ((TrayIcon)src).dispatchEvent(event);
  610           } else if (src instanceof AWTAutoShutdown) {
  611               if (noEvents()) {
  612                   dispatchThread.stopDispatching();
  613               }
  614           } else {
  615               System.err.println("unable to dispatch event: " + event);
  616           }
  617       }
quindi sono giunto a un paio di conclusioni(come scritto nelle api)
O come source si ha un derivato di Component o MenuComponent o TrayIcon, e in questo caso l'evento viene postato in modo automatico, O l'evento è di una classe che estende ActiveEvent, e in questo caso viene chiamato il suo metodo dispatch che DEVE essere sovrascritto, cosa che io non facevo, ora cosa cavolo bisognerebbe scrivere dentro dispatch dell'action event?

perchè il mio obbiettivo sarebbe questo:
una volta trovato il mio evento del touch, incapsulare un mio oggetto che contiene informazioni sull'evento stesso e lanciarlo nella cod di awt, da un altra parte del programma verificare continuamente la coda e vedere se il source dell'evento primo della coda è del mio tipo, e in caso processarlo.
quindi vedendo tutti gli Event in java.awt.event il più adatto alla mia situazione sarebbe proprio activeevent, visto che non mi legherebbe a niente (mouse, key, componentevent, etc..) il problema è che action event deve sovrascrivere quel diavolo di metodo dispatch!! come posso fare?

PS tutte queste cose le hai lette in un libro o da internet? mi potresti postare dove?
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77

Ultima modifica di *andre* : 24-05-2009 alle 11:08.
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 11:13   #11
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
scusami mi sono confuso con active e action event

la soluzione per me è un activeevent (credo) ma non so come avere un listener per questo genere di eventi..
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77

Ultima modifica di *andre* : 24-05-2009 alle 12:08.
*andre* è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 16:08   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Le cose che so sono il frutto di un collage di libri letti ed esperimenti fatti nel corso degli anni. Non ho una fonte univoca da poterti dare.

Usi la coda degli eventi di sistema la usi se vuoi approfittare del meccanismo predefinito di propagazione degli eventi che consiste semplicemente nella notifica di un certo evento a tutti gli ascolatori di evento registrati e attivi per una certa classe di eventi.

L'ultimo post mi sembra suggerire il fatto che di questo meccanismo predefinito in verità non ti interessi granchè.

Allora perchè non creare una tua coda degli eventi? Sei molto più libero.

E' un semplice schema produttore-consumatore. Da una parte rilevi i touch, quando si verificano li immetti nella tua coda, dall'altra parte avrai uno o più consumatori che ricevono automaticamente la notifica di produzione dei touch e reagiscono di conseguenza. Senza eventi e listener AWT.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2009, 21:16   #13
*andre*
Senior Member
 
Iscritto dal: Sep 2007
Messaggi: 1071
innanzitutto grazie delle risposte che mi hai dato, mi hanno aiutato a risolvere questo problema

alla fine sono riiuscito a usare un actionevent!!

tutti i miei dubbi si sono risolti con una prova, in pratica non avevo capito che quando crei un actionevent il parametro source(nelle api viene chiamato così) che sarebbe un component, è il conponent A cui viene segnalato l'evento, quindi mi è bastato avere un riferimento alla mia window, e dentro il suo codice abilitarla a ascoltare gli actionevent con .enableEvents(AWTEvent.ACTION_EVENT_MASK); e l'evento viene processato dal metodo processEvent(AWTEvent e) !!

sarebbe un'ottima soluzione da implementare una mia queue, solo che questo progetto lo devo consegnare prima della fine dell'anno scolastico, e quindi per ora cerco di farlo nel modo migliore senza usare troppo tempo, devo ancora fare le applicazioni

grazie di tutto! domani provo a usare il blur e scalare un'immagine, a proposito sai come si fa?
__________________
Affari: ariakasneverborne, PanCar, Luk@°°°, Fabio310, kintaro oe, krike, fabry180384, dariox am2, chiadoz, windsofchange, dado1979, Rudyduca, aleforumista, Sheva77
*andre* è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Stazione Spaziale Internazionale: rientr...
Forza Horizon 6: spunta la possibile dat...
Oral-B iO: sconti pazzeschi su spazzolin...
Intel Core Ultra 200 Plus: l'azienda pro...
Thinking Machines: la startup di Mira Mu...
Coalizione di gruppi di tutela chiede a ...
Reprompt è l'attacco invisibile s...
Robot aspirapolvere ECOVACS DEEBOT N20 P...
Batteria a stato solido: tra tre mesi Do...
iPhone 17 Pro in forte sconto su Amazon:...
Apple Studio Display finalmente in offer...
OpenAI sfida Google e lancia ChatGPT Tra...
Attenti ai commenti LinkedIn: come ricon...
Xiaomi Redmi Note 15 al prezzo minimo ga...
REDMI Buds 8 Lite in arrivo in Italia: A...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v