Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
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...
Ryzen AI Max+: secondo Intel non hanno s...
Galaxy Z Flip7 Olympic Edition: lo smart...
Patch di emergenza per Microsoft Office:...
Google Pixel 10 Pro al minimo storico su...
Highguard debutta con numeri record, ma ...
Offerte Tineco Amazon: scope elettriche ...
Apple rilascia iOS 26.2.1 e iPadOS 26.2....
NVIDIA presenta Earth-2: il sistema AI c...
iPhone 5s si aggiorna dopo 13 anni dal l...
Meta al lavoro per introdurre degli abbo...
Warcraft, Diablo e Overwatch: saranno 4 ...
Dragon Ball: annunciato Project Age 1000...
Insta360 Flow a 69,99€ con coupon: lo st...
La Francia si prepara a essere il primo ...
Asahi Linux su M3 Mac: il boot riuscito ...
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: 11:49.


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