Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
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


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Il Galaxy S26 Edge potrebbe essere ancor...
Google riaccenderà una centrale n...
Crollo per Pornhub nel Regno Unito:-77% ...
La Germania accende il suo cannone laser...
Il meglio di Amazon in 2 minuti: tira ar...
ECOVACS risponde a Eureka e dimezza il p...
Durissimo colpo per Nintendo: l'ufficio ...
Scope elettriche al minimo storico su Am...
Blue Jay e Project Eluna: robotica e AI ...
Scede a 949€ il Samsung Galaxy S25 Ultra...
Blue Yeti Nano in super offerta su Amazo...
Netflix sta preparando un'offerta per Wa...
Prezzo impossibile, è sceso ancor...
Torna il migliore dei mini PC economici:...
USA, via libera all'uso di plutonio mili...
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: 19:05.


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