|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
[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: Codice:
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! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2773
|
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.
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
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 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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ì: Codice:
// file Class1.java public class Class1 { ... ... JPanel canvas; public Class1() { ... canvas = new JPanel(...) { public void paintComponent(Graphics g) { // rendering... } }; ... } } Fare così ti può essere utile nel momento in cui hai bisogno che la tua Classe1 estenda un altra classe, oltre a JPanel.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 23-01-2010 alle 13:30. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
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 |
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
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 |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2773
|
La soluzione che suggerivo io in pseudojava sarebbe una cosa del genere:
Codice:
public class A extends JPanel{ ... //Punto in cui instanzi il SerialListener new B(this); ... } Codice:
public class B implements SerialListener{ private JPanel pan; ... public B(JPanel p){ pan=p; ... } public void SerialEvent(){ pan.repaint(); } ... } |
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
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) Ultima modifica di Wilhem : 25-01-2010 alle 16:18. Motivo: aggiunta di info |
![]() |
![]() |
![]() |
#10 |
Junior Member
Iscritto dal: Jul 2005
Messaggi: 6
|
Nessuno puo darmi una mano?
![]() ![]() ![]() Grazie cmq ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:01.