View Full Version : [JAVA] Creare una classe che genera eventi
Salve a tutti raga,
mi trovo ad affrontare un problema che per ragioni di spazio e chiarezza sintetizzo nello segeunte schema:
Dunque ho una classe che estende JPanel al cui interno ho costruito una inner class che implementa l interface della porta seriale:
public class Class1 extends JPanel{
// Codice di esecuzione
public class InnerClass implements SerialListener{
// Codice della classe
public void SerialEvent(){
repaint();
}
}
public void paintComponent(){
// Codice della classe che realizza un disegno sul panel
}
}
La ragione della classe all interno di Class1 è dovuta al fatto che non sapevo come fare per eseguire il metodo repaint() ogni volta che un evento (trattandosi di seriale l arrivo di un dato sulla porta omonima) viene creato.
Il problema è che tale soluzione, essendo la InnerClass molto "lunga" rende il codice illegilbile nonostante posso assicurare e ho gia testatio che funziona alla grande.
Vorrei istanziare nella Class1 una classe "a parte" della classe che implementa l interfaccia seriale ma a quel punto non posso piu richiamre repaint() ogni volta che un evento arriva sulla porta seriale.
Come posso fare per risolvere tale problema?
Qualcuno puo darmi qualkche suggerimento???
Grazie a tutti in anticipo
Bye!
wingman87
22-01-2010, 17:24
L'evento deve comunque essere catturato da un listener, quindi se anche creassi una classe a parte che genera eventi dovresti comunque implementare un listener nella classe principale. Altrimenti potresti dare alla classe generatrice un riferimento al JPanel associato e invece di sollevare un evento richiamare direttamente il repaint.
Ti ringrazio mille wing, penso che hai capito perfettamente quello che voglio fare e difatti avevo anche io preso in considerazione l idea di mettere un listener nella classe che genera il JPanel.
Come soluzione non mi sembra per niente male, a devo dire che me la cavo con codice "staccato" e chiaro in modo pure elegante.
Per la seconda opzione invece non ho capito bene come dovrei procedere, intendi istanziare direttamente il panel dalla classe che ha listener degli eventi???
Ma in questo modo scusami diventerebbe un po "antiintuitivo" il codice stesso, visto che mi ritroverei con la classe del panel ad essere generata dal codice che implementa l ascolto sulla seriale.
Oppure mi sbaglio?
Potresti dirmi di piu??
Grazie mille
Ciao
banryu79
23-01-2010, 13:24
Come ha già detto wingman87 potresti dichiarare la classe che implementa l'interfaccia SerialListener in un file .java a parte; a quel punto e' sufficiente che al momento oppurtuno, che dipende dal resto della logica del tuo applicativo (in fase di inizializzazione della classe / quando il JPanel e' disponibile) passi a questa classe un riferimento a Class1(che e' un JPanel); a questo punto il repaint lo invochi direttamente tramite il riferimento.
Nota, tra l'altro, che forse (dipende dal resto dell'applicazione, che non vediamo) non sei costretto a far estendere a Class1 la classe JPanel: potrebbe essere sufficiente dichiarare in Classe1 un membro di istanza di tipo JPanel inizializzandolo (in questo caso dentro il costruttore) così:
// file Class1.java
public class Class1
{
...
...
JPanel canvas;
public Class1()
{
...
canvas = new JPanel(...) {
public void paintComponent(Graphics g) {
// rendering...
}
};
...
}
}
In questo modo tutte le chiamate che prima facevi nella Classe1 a JPanel tramite il puntatore this ora le devi fare tramite il riferimento (canvas, nell'esempio).
Fare così ti può essere utile nel momento in cui hai bisogno che la tua Classe1 estenda un altra classe, oltre a JPanel.
Grazie mille per le risposte
dunque vedo che fare tutto partendo come classe principale una classe che estende JFrame non si riesce...
a questo punto l unica soluzione consiste quindi nella generazione di eventi che vengono poi ascoltati dalla classe principale quando un dato sulla seriale é pronto...
grazie ancora per il vostro aiuto!!
ciao
Salve raga di nuovo,
smebra che non ne riesco a venirne a capo e ad uscire da questo apparente semplice problema.
Come posso fare per far si che in una classe venga genrato un evento e che questo evento venga "acchiappato" da un altra classe??
Come faccio a implementare una simile soluzione??
Grazie a tutti
ciao
wingman87
23-01-2010, 20:02
La soluzione che suggerivo io in pseudojava sarebbe una cosa del genere:
public class A extends JPanel{
...
//Punto in cui instanzi il SerialListener
new B(this);
...
}
public class B implements SerialListener{
private JPanel pan;
...
public B(JPanel p){
pan=p;
...
}
public void SerialEvent(){
pan.repaint();
}
...
}
...qualche (http://www.hwupgrade.it/forum/showthread.php?t=1990607) spunto...
...ciao Andrea...
Grazie raga!!!!!!!
con il tuo "giochetto" wingman ho risolto alla grande il problema anche se devo ammettere che adesso ho un po di problemi ad aggiungere buttoni che agiungono funzionalita alla GUI perche adesso per ogni cosa devo pare un passaggio per riferimento alla classe che gestisce la seriale.
Per cui avevo due domande da farvi ragazzi, visto che sio sono uno smanettone ma ancora con java sono agli "inizi" (ho appena completato un corso serale e eletto qulche libro).
Cosa mi consigliate (fermo resatando che dipende dal tipo di applicazione) di fare?: Un main prog che "gira" prendendo i valori dall seriale e da cui istanzia un frame e i relativi JPanels oppure come ho gia iniziato io un mainframe principale da cui poi la seriale viene richiamata in un altra classe???
Altra cosa che vi volevo chiedere. Nel mio programma una stessa grandezza da due sorgenti diverse viene visualizzata allo stesso modo su due panel identici.
Il problema è che qundo istanzio i due panel sono due oggetti con le stesse caratteristiche, Come faccio a far si che un panel mi lavora con i dati di una sorgente e che l altro lavora con i dati dell altra sorgente? Esiste un modo per far si che un panel o una classe si rende conto "dell esistenza di uan altra" simile e commuta a quel punto le proprie variabili per prenderle da un alta srgente???
Grazie a tuti per il vostro aiuto!!!!
Ciao!!!!!!!!!!!!!!!!!!!!!!!!!!
Ovvimente se volete posso postarvi anche qualche riga di codice che ho scritto (vorrei solo tenre la discussione il piu semplice e generale possibile)
Nessuno puo darmi una mano? :( :(
:help: please!!!!
Grazie cmq :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.