View Full Version : Semplice gui con Netbeans
loop4633
21-10-2010, 19:44
Ciao a tutti, ho un problema stupidissimo, spero che qualcuno di voi voglia aiutarmi, vi spiego: non mi sono mai soffermato sulla creazione di interfaccie grafiche, l'altra sera mi sono messo a realizzare una piccola interfaccia per un generatore casuale con netbeans, ma non capisco perchè ho seguito la guida se pur datata che offre netbeans ma quando tento di bindare il pulsante su una jlist o qualsiasi jpanel mi esce sempre un errore di questo tipo:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2990)
at org.jdesktop.beansbinding.Binding.convertForward(Binding.java:1312)
at org.jdesktop.beansbinding.Binding.getSourceValueForTarget(Binding.java:844)
at org.jdesktop.beansbinding.Binding.refreshUnmanaged(Binding.java:1222)
at org.jdesktop.beansbinding.Binding.refresh(Binding.java:1207)
at org.jdesktop.beansbinding.AutoBinding.tryRefreshThenSave(AutoBinding.java:162)
at org.jdesktop.beansbinding.AutoBinding.bindImpl(AutoBinding.java:199)
at org.jdesktop.beansbinding.Binding.bindUnmanaged(Binding.java:959)
at org.jdesktop.beansbinding.Binding.bind(Binding.java:944)
at org.jdesktop.beansbinding.BindingGroup.bind(BindingGroup.java:143)
at superenalotto.Super.initComponents(Super.java:142)
at superenalotto.Super.<init>(Super.java:26)
at superenalotto.Super$2.run(Super.java:185)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 3 seconds)
il poco codice che ho inserito è questo: http://nopaste.info/fded0565dc.html
Spero che qualcuno voglia aiutarmi.
Saluti
banryu79
22-10-2010, 09:29
Non conosco la libreria di binding "org.jdesktop.beansbeanding..." che si vede in uso.
L'unica cosa che ho capito è che la chiamata che provoca l'errore, nel codice linkato, si trova nel metodo initComponents(), qui:
...
131. bindingGroup.bind();
...
Dato che il codice di initComponents() è iniettato dall'editor di GUI di NetBeans tenderei ad escludere un errore da parte tua. Magari è un bug della libreria...
loop4633
22-10-2010, 09:48
Grazie 1000 per la tua risposta banryu79... proprio non riesco a risolvere il problema, credo che leggerò la guida che ho trovato nella tua firma :) mi sa che è meglio fare a mano...
banryu79
22-10-2010, 10:21
Grazie 1000 per la tua risposta banryu79... proprio non riesco a risolvere il problema, credo che leggerò la guida che ho trovato nella tua firma :) mi sa che è meglio fare a mano...
La guida che ho in firma è ottima.
E sì, anche se io ero ostico all'idea, è meglio "fare a mano" :)
Diciamo che l'editor grafico è molto comodo per prototipare rapidamente una GUI e vedere come viene fuori, con il prerequisito di saperla comunque "fare a mano". Altrimenti ti fa perdere tempo :D
Dopo che hai letto la guida, e provato a buttare giù qualcosa, se hai difficoltà torna pure a postare qui: ti si da volentieri una mano.
loop4633
22-10-2010, 10:45
grazie :) ti farò sapere... intanto spero di trovare il tempo di leggerla :D
Ciao a tutti, ho un problema stupidissimo, spero che qualcuno di voi voglia aiutarmi, vi spiego: non mi sono mai soffermato sulla creazione di interfaccie grafiche, l'altra sera mi sono messo a realizzare una piccola interfaccia per un generatore casuale con netbeans, ma non capisco perchè ho seguito la guida se pur datata che offre netbeans ma quando tento di bindare il pulsante su una jlist o qualsiasi jpanel mi esce sempre un errore di questo tipo:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2990)
at org.jdesktop.beansbinding.Binding.convertForward(Binding.java:1312)
at org.jdesktop.beansbinding.Binding.getSourceValueForTarget(Binding.java:844)
at org.jdesktop.beansbinding.Binding.refreshUnmanaged(Binding.java:1222)
at org.jdesktop.beansbinding.Binding.refresh(Binding.java:1207)
at org.jdesktop.beansbinding.AutoBinding.tryRefreshThenSave(AutoBinding.java:162)
at org.jdesktop.beansbinding.AutoBinding.bindImpl(AutoBinding.java:199)
at org.jdesktop.beansbinding.Binding.bindUnmanaged(Binding.java:959)
at org.jdesktop.beansbinding.Binding.bind(Binding.java:944)
at org.jdesktop.beansbinding.BindingGroup.bind(BindingGroup.java:143)
at superenalotto.Super.initComponents(Super.java:142)
at superenalotto.Super.<init>(Super.java:26)
at superenalotto.Super$2.run(Super.java:185)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD SUCCESSFUL (total time: 3 seconds)
il poco codice che ho inserito è questo: http://nopaste.info/fded0565dc.html
Spero che qualcuno voglia aiutarmi.
Saluti
Scusa ma che bind stai cercando di fare esattamente?
loop4633
22-10-2010, 11:24
Allora ti spiego in breve: praticamente prima avevo fatto questo generatore tutto con joptionPane volevo provare come prima cosa a lasciare i joptionPane per l'inserimento del numero di combinazioni e numeri da generare e visualizzare semplicemente quando cliccavo su genera i numeri casuali su una jlist, ho seguito la guida di netbeans (che risale alla prima guerra mondiale) dove dicevano di cliccare sulle proprietà del pulsante e cercare il menù bind, ovviamente nella nuova versione di netbeans non esiste sta cosa, c'è una scheda vicino quella di proprietà che si chiama binding, uno dei campi presenti si chiama bound (al posto del bind descritto nella guida) ho semplicemente inserito come destinazione del pulsante la jlist e mi esce questo errore.
Spero di essere stato chiaro
Allora ti spiego in breve: praticamente prima avevo fatto questo generatore tutto con joptionPane volevo provare come prima cosa a lasciare i joptionPane per l'inserimento del numero di combinazioni e numeri da generare e visualizzare semplicemente quando cliccavo su genera i numeri casuali su una jlist, ho seguito la guida di netbeans (che risale alla prima guerra mondiale) dove dicevano di cliccare sulle proprietà del pulsante e cercare il menù bind, ovviamente nella nuova versione di netbeans non esiste sta cosa, c'è una scheda vicino quella di proprietà che si chiama binding, uno dei campi presenti si chiama bound (al posto del bind descritto nella guida) ho semplicemente inserito come destinazione del pulsante la jlist e mi esce questo errore.
Spero di essere stato chiaro
Ma il bind serve a collegare due beans(componenti swing in questo caso) attraverso una proprietà, un jbutton con una jlist cos'ha da spartire?
Se devi generare i numeri
al click del pulsante basta che usi l'evento actionperformed.
Comunque linka sta guida che vediamo.
loop4633
22-10-2010, 12:35
si, infatti se vedi il codice che ho pastato sta dentro actionPerformed, ma non so come si fa a farlo stampare sulla jlist...
Questo è la guida che ho letto, ho provato a fare anche quello che fanno loro semplicemente con le texbox ma nn mi funziona!
http://netbeans.org/kb/docs/javafx/data-binding.html
Anche se proprio in questo istante ho visto che è JavaFX questo :muro:
banryu79
22-10-2010, 12:37
...
Anche se proprio in questo istante ho visto che è JavaFX questo :muro:
BOOOM! :D
All'inizio, in alto, c'era pure scritto:
...
To follow this tutorial, you need the following software and resources.
Software or Resource
NetBeans IDE
Java Development Kit (JDK)
JavaFXComposer plugin
JavaFX SDK
Per JList:
- How to... dai Java Tutorials (http://download.oracle.com/javase/tutorial/uiswing/components/list.html)
si, infatti se vedi il codice che ho pastato sta dentro actionPerformed, ma non so come si fa a farlo stampare sulla jlist...
Questo è la guida che ho letto, ho provato a fare anche quello che fanno loro semplicemente con le texbox ma nn mi funziona!
http://netbeans.org/kb/docs/javafx/data-binding.html
Anche se proprio in questo istante ho visto che è JavaFX questo :muro:
Esatto non ti serve quella guida.
Ti faccio un breve esempio di bind così capisci a cosa serve.
Apri un bel JPanel, metti due Jtextfield e chiamale "sourceText" e "targetText".
Ora clicca di destro su "targetText" -> bind -> text.
Ti si apre una finestrella dove imposti il bind:
Binding Source: metti "sourceText"
Binding Expression: scegli dalla lista text, in questo modo stai dicendo alla jtextfield "targetText" di collegare il proprio valore di "text" con quello della "sourceText".
Provandolo infatti otterrai che scvrivendo nella jtextfield "sourceText" il testo sarà copiato in "targetText" e viceversa.
loop4633
22-10-2010, 12:41
Sono un idiota cieco! Devo leggere un po
loop4633
22-10-2010, 12:53
grazie 1000 raga, vado ad istruirmi un po :) vi aggiornerò :D
loop4633
22-10-2010, 15:47
Allora ho fatto così momentaneamente, lasciando stare che su sto sito di oracle non trovo la documentazione ufficiale e sto impazzendo! non posso verificare se jTextPane.getText riceve il mio play forzato come String. Ma la domanda che avrei da fare è come mai non mi riconosce il tipo String? Vero che sono impastato troppo di c per adesso ma ricordo che in java era supportato String come in c++. Per insulti ed informazioni sono qui :D
http://nopaste.info/e3ee890ce1.html
Grazie a tutti
loop4633
22-10-2010, 15:51
Finalmente ho trovato la documentazione ufficiale :ciapet:
Occhio ai costruttori in java
Occhio ai costruttori in java
Ok quello è forse la punta dell'icebearg, ma ti compila quel codice? :asd: ne dubito.
loop4633
22-10-2010, 16:08
purtroppo no perchè non mi riconosce il tipo String :help:
Ma poi il fatto che non so come fare (ancora non sono entrato nell'ottica sto finendo di leggere la guida che ho preso da sto forum) a fargli capire in sostanza che quando premo il pulsante generate lui deve eseguirmi il metodo superenalotto e poi tramite jTextPane.setText dovrebbe stamparmi sull'interfaccia grafica... o almeno spero... :mc:
purtroppo no perchè non mi riconosce il tipo String :help:
Ma poi il fatto che non so come fare (ancora non sono entrato nell'ottica sto finendo di leggere la guida che ho preso da sto forum) a fargli capire in sostanza che quando premo il pulsante generate lui deve eseguirmi il metodo superenalotto e poi tramite jTextPane.setText dovrebbe stamparmi sull'interfaccia grafica... o almeno spero... :mc:
Allora, partiam dall'inizio, ti devi guardare:
1- lo scope delle variabili in java
2- la loro dichiarazione in una classe
3- e cosa sono e come si usano i costruttori delle classi.
Dopodichè, se avrai ancora problemi, siamo qui :D
loop4633
22-10-2010, 16:17
ok grazie :)
ok grazie :)
prego, quelli sono gli errori che ho notato a prima vista, risolto quelli poi si può parlare della struttura del tuo programma.
banryu79
22-10-2010, 16:49
purtroppo no perchè non mi riconosce il tipo String :help:
Ho visto che nel codice, a un certo punto, stavi tentando di fare una cosa così:
String res = null;
...
int play = 0;
...
...
res = (String)play;
Ovviamente non funzionona: non puoi promuovere una variabile primitiva di tipo int al tipo reference to java.lang.String.
Quello che volevi fare si fa così:
...
res = "" + play;
Oppure, in modo più esplicito:
...
res = String.valueOf(play);
Ho visto che nel codice, a un certo punto, stavi tentando di fare una cosa così:
String res = null;
...
int play = 0;
...
...
res = (String)play;
Ovviamente non funzionona: non puoi promuovere una variabile primitiva di tipo int al tipo reference to java.lang.String.
Quello che volevi fare si fa così:
...
res = "" + play;
Oppure, in modo più esplicito:
...
res = String.valueOf(play);
Ma quello è niente :asd:
banryu79
22-10-2010, 17:08
Ma quello è niente :asd:
No, quello è l'inizio :read:
No, quello è l'inizio :read:
Mica vero, l'inizio è questo
public String res=null;
public class SuperEnalotto extends javax.swing.JFrame {
...
banryu79
22-10-2010, 17:13
Mica vero, l'inizio è questo
public String res=null;
public class SuperEnalotto extends javax.swing.JFrame {
...
Stai scherzando vero?
Io con "inizio" intendevo l'inizio dei suoi problemi, non del codice sorgente :asd:
Stai scherzando vero?
Io con "inizio" intendevo l'inizio dei suoi problemi, non del codice sorgente :asd:
E non coincide in questo caso?
banryu79
22-10-2010, 17:18
E non coincide in questo caso?
[OT:vaneggio del venerdì sera]
Diciamo che dal mio punto di vista viene leggermente prima la conoscenza del sistema dei tipi che lo scope delle variabili, che poi con lo scoping (:oink:) si sa che ci si distrae... :D
Ma con i tipi non si scherza... potrebbe capitare di incontrare un brutto tipo (:boxe: ) e allora son dolori...
loop4633
22-10-2010, 17:18
Il fatto del casting ovviamente era palesemente errato... ma lavorando da 8 mesi con c ho quasi formattato java!
Grazie per gli aiuti comunque :)
Diciamo che dal mio punto di vista viene leggermente prima la conoscenza del sistema dei tipi che lo scope delle variabili, che poi con lo scoping (:oink:) si sa che ci si distrae... :D
La dichiarazione di una variabile non si può fare fuori da una classe in java.
Ed è l'errore principale perchè non viene proprio vista come variabile da netbeans, quindi inutile anche stare a fare un cast corretto o scorretto che sia :asd:
Quello è uno, dopo viene che il costruttore ha un valore di ritorno, sbagliato anche questo, poi ci si può concentrare sul fatto che play è dichiarato nel coistruttore quindi invisibile al metodo dell'evento.
Messo a posto tutto questo, si può parlare di come fare il cast tra String e int.
Tutto ovviamente SECONDO ME.
loop4633
01-11-2010, 16:51
Ciao ragazzi, finalmente ho trovato di nuovo 10 minuti da dedicare a quel discorsetto dell'altra volta :D
Scusatemi per gli errori dell'altra volta ma non avevo neanche visto il fatto di aver dichiarato globalmente la variabile fuori dalla classe :doh:
Ho sistemato una cosa, sto ancora facendo prove per capire come funzionano i metodi grafici, vi posto sotto il codice, ma la mia domanda è: Come faccio con il ciclo for a far stampare i numeri su righe diverse o comunque spaziati fra di loro? me ne stampa solo uno. Poi come mai se non chiamo il metodo Generator() nel costruttore mi compare la finestra vuota quando eseguo?
Spero di non scatenare l'ira di MEMon :D
Banryu79 ho letto quel tutorial che porti in firma ma mancano i metodi per "legare" il codice sorgente alla grafica...
http://nopaste.info/d741b0654e.html
Ciao ragazzi, finalmente ho trovato di nuovo 10 minuti da dedicare a quel discorsetto dell'altra volta :D
Scusatemi per gli errori dell'altra volta ma non avevo neanche visto il fatto di aver dichiarato globalmente la variabile fuori dalla classe :doh:
Ho sistemato una cosa, sto ancora facendo prove per capire come funzionano i metodi grafici, vi posto sotto il codice, ma la mia domanda è: Come faccio con il ciclo for a far stampare i numeri su righe diverse o comunque spaziati fra di loro? me ne stampa solo uno. Poi come mai se non chiamo il metodo Generator() nel costruttore mi compare la finestra vuota quando eseguo?
Spero di non scatenare l'ira di MEMon :D
Banryu79 ho letto quel tutorial che porti in firma ma mancano i metodi per "legare" il codice sorgente alla grafica...
http://nopaste.info/d741b0654e.html
Perchè il metodo che genera la gui è
initComponents();
Dovrebbe stare nel costruttore, ma l'hai infilato nel metodo Generator (solitamente in java non si iniziano mai i nomi dei metodi con la maiuscola, quello si fa ad esempio in c#).
Te ne stampa solo uno perché ogni volta è quello che gli stai passando.
jtextarea.setText(text) imposta il testo text dentro la textarea, quindi devi fare in modo che text contenga tutti i numeri, non solo l'ultimo, e per farlo ti basta fare una concatenzione di stringhe.
loop4633
02-11-2010, 21:19
Grazie MEMon per la tua risposta, provvederò a sistemare! sai consigliarmi una buona documentazione per la gestione database con Derby? o consigliarmi qualcosa per integrare un database in una applicazione?
loop4633
03-11-2010, 00:16
Scusatemi ho apportato alcune modifiche (suggeritemi da MEMon) ma non capisco perchè mi genera quest'errore con le stringhe, posto il codice con relativo errore riportato sotto sperando che qualcuno voglia aiutarmi.
http://nopaste.info/4dbbbc4756.html
banryu79
03-11-2010, 08:56
Scusatemi ho apportato alcune modifiche (suggeritemi da MEMon) ma non capisco perchè mi genera quest'errore con le stringhe, posto il codice con relativo errore riportato sotto sperando che qualcuno voglia aiutarmi.
http://nopaste.info/4dbbbc4756.html
Io ti voglio aiutare, ma voglio farlo affiancandoti nella tua ricerca dell'errore, e non spiattelandotelo, che non serve a imparare.
Procediamo con ordine, questo è l'output prodotto dall'esecuzione del codice di cui al link, dopo che premi sul pulsante:
# Error:
#
# Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
# at my.superenalotto.SuperEnalotto.jButton1ActionPerformed(SuperEnalotto.java:117)
# at my.superenalotto.SuperEnalotto.access$000(SuperEnalotto.java:20)
# at my.superenalotto.SuperEnalotto$1.actionPerformed(SuperEnalotto.java:72)
# at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
# at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
# at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
# at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
# at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
# at java.awt.Component.processMouseEvent(Component.java:6352)
# at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
# at java.awt.Component.processEvent(Component.java:6117)
# at java.awt.Container.processEvent(Container.java:2085)
# at java.awt.Component.dispatchEventImpl(Component.java:4714)
# at java.awt.Container.dispatchEventImpl(Container.java:2143)
# at java.awt.Component.dispatchEvent(Component.java:4544)
# at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621)
# at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
# at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
# at java.awt.Container.dispatchEventImpl(Container.java:2129)
# at java.awt.Window.dispatchEventImpl(Window.java:2478)
# at java.awt.Component.dispatchEvent(Component.java:4544)
# at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
# at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
# at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
# at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
# at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
# at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
# at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
# BUILD SUCCESSFUL (total time: 34 seconds)
Ti ho evidenziato in rosso scuro il tipo di eccezione che viene lanciata, e in grassetto il punto del codice in cui viene lanciata quell'eccezione.
Richiesta:
Che istruzioni sono presenti, nel codice sorgente, alla riga "incriminata"?
loop4633
03-11-2010, 09:26
la cosa strana è proprio questa, nella riga incriminata c'è semplicemente la chiamata da parte dell'oggetto al metodo generator
se.generator()
non c'è altro... cosa c'è di sbagliato qui che genera quest'eccezione? La cosa che mi fa impazzire pure è che se non gestisco le stringhe ma semplicemente faccio generare un numero faccio il cast a string e lo metto nella text area sempre al click su generate tutto funziona bene, appena faccio questa concatenazione di stringhe mi impazzisce...
la cosa strana è proprio questa, nella riga incriminata c'è semplicemente la chiamata da parte dell'oggetto al metodo generator
se.generator()
non c'è altro... cosa c'è di sbagliato qui che genera quest'eccezione? La cosa che mi fa impazzire pure è che se non gestisco le stringhe ma semplicemente faccio generare un numero faccio il cast a string e lo metto nella text area sempre al click su generate tutto funziona bene, appena faccio questa concatenazione di stringhe mi impazzisce...
E' proprio lì l'errore, controlla bene le tue variabili, vedrai che c'è qualcosa che non va, e non dico dentro la funzione "generator", quella ancora non viene chiamata.
ps. si vede ad una prima occhiata cosa c'è che non va, quindi non starti a scervellare troppo, ce l'hai davanti!
banryu79
03-11-2010, 14:02
Proseguiamo nell'analisi:
Richiesta:
Che istruzioni sono presenti, nel codice sorgente, alla riga "incriminata"?
Risposta:
[...]
nella riga incriminata c'è semplicemente la chiamata da parte dell'oggetto al metodo generator
se.generator()
[...]
Dunque, come hai rilevato, alla riga segalata l'unica istruzione presente è
se.generator();
Ora proviamo ad analizzare questa istruzione nelle sue singole "parti" tenendo in considerazione l'eccezione provocata: NullPointerException.
Ciò implica che prima di tutto dobbiamo conoscere la semantica di una NullPointerException; cosa significa, quando viene lanciata e perchè.
Per recuperare queste informazioni consultiamo i javadoc (http://download.oracle.com/javase/6/docs/api/), i quali ci raccontano quanto segue:
[in java.lang.NullPointerException Javadoc page]
...
Thrown when an application attempts to use null in a case where an object is required. These include:
* Calling the instance method of a null object.
* Accessing or modifying the field of a null object.
* Taking the length of null as if it were an array.
* Accessing or modifying the slots of null as if it were an array.
* Throwing null as if it were a Throwable value.
Richiesta 1:
Dopo aver letto la documentazione circa l'eccezione NullPointerException, riconosci se l'istruzone presente alla riga segnalata è riconducibile a uno dei casi elencati e quotati qua?
Richiesta 2:
Se sei riuscito a soddisfatto la Richiesta 1, riesci ora a spiegare perchè viene lanciata l'eccezione?
loop4633
03-11-2010, 15:05
Credo che il problema sia l'istanziazione dell'oggetto, ho modificato così:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
SuperEnalotto se=new SuperEnalotto();
se.generator();
}
adesso non mi da più l'errore ma non mi stampa sulla textarea il risultato!
loop4633
03-11-2010, 15:38
Ho trovato un buon link per database Derby lo lascio magari può servire a qualcuno: http://db.apache.org/derby/integrate/plugin_help/derby_app.html
Vorrei capire invece qual'è la differenza fra derby e entity manager usato da netbeans
banryu79
03-11-2010, 17:04
Credo che il problema sia l'istanziazione dell'oggetto, ho modificato così:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
SuperEnalotto se=new SuperEnalotto();
se.generator();
}
adesso non mi da più l'errore ma non mi stampa sulla textarea il risultato!
Io ti faccio domande dirette e precise e... limitate, e tu invece di soddisfarle con risposte altrettanto limitate rispondi con un messaggio articolato, dimostrando di aver inquadrato il problema ma di avere fatto nel frattempo anche 4 passi avanti in più (che sollevano altre questioni e che spostano l'attenzione da quello che era il problema iniziale, che non è ancora stato completamente soddisfatto, infatti ancora hai... problemi).
Voglio aiutarti ma nel farlo ho il mio metodo e ti chiedo di seguirmi: se ti va, prova di volta in volta a includere nella/e risposta/e solo ciò che è neccessario e sufficiente per soddisfare la/e richiesta/e posta/e; se invece non ti va bene dimmelo che lascio perdere.
Puoi rispondere di nuovo, come ti ho chiesto, a queste due richeste?
Richiesta 1:
Dopo aver letto la documentazione circa l'eccezione NullPointerException, riconosci se l'istruzone presente alla riga segnalata è riconducibile a uno dei casi elencati e quotati qua?
Richiesta 2:
Se sei riuscito a soddisfatto la Richiesta 1, riesci ora a spiegare perchè viene lanciata l'eccezione?
loop4633
03-11-2010, 17:20
Scusami banryu79 non volevo evitare le tue domande, pensavo semplicemente l'errore fosse quello.
Rispondendo alle tue domande credo che la riga possa essere riconducibile al primo caso, ma non capisco il perchè venga generata quell'eccezione!
Grazie mille per il vostro aiuto
banryu79
03-11-2010, 17:50
Rispondendo alle tue domande credo che la riga possa essere riconducibile al primo caso, ma non capisco il perchè venga generata quell'eccezione!
Esatto, ovvero invocazione di un metodo di istanza tramite un riferimento nullo.
Il riferimento nullo, in questo caso, è 'se'.
A runtime, nel momento in cui premi sul pulsante, il riferimento 'se' vale null e quindi la virtual machine resta in mutande quando deve eseguire l'istruzione "se.generator()": ergo lancia una NullPointerException.
Il problema quindi, in sintesi, è il valore di 'se': perchè vale null?
Il sistema dei tipi del linguaggio Java comprende 8 tipi primitivi:
byte, short, int, long, float, double, boolean e char; puoi leggere qualcosa al riguardo qui. (http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
C'è poi il tipo reference (riferimento) che in pratica è un puntatore.
Una reference "punta" a una instanza di una classe creata in memoria.
Ad esempio l'istruzione:
SuperEnalotto se = new SuperEnalotto();
ha l'effetto di:
1 - dichiarare una reference di tipo SuperEnalotto di nome 'se' (lato snx);
2 - creare una istanza (un oggetto) in memoria di tipo SuperEnalotto (lato dx);
3 - assegnare come valore alla reference 'se' l'istanza creata (unione del punto 1 e del punto 2 mediante l'operatore di assegnamento '=').
Nota ora, come il codice seguente sia negli effetti pratici e nella semantica equivalente al precedente:
SuperEnalotto se;
se = new SuperEnalotto();
La differenza è che ora abbiamo due istruzioni: uno, la dichiarazione del riferimento 'se' di tipo SuperEnalotto, e due, l'assegnamento di una nuova istanza di tipo SuperEnalotto come valore di 'se'.
E ora la domanda fatidica (Richiesta 3):
Se considero solo la prima istruzione, cioè il codice seguente, quale sarà il valore di 'se'?
// qui 'se' ancora non esite
SuperEnalotto se;
// qua 'se' esiste...
// quale valore ha 'se' in questo punto del codice?
loop4633
03-11-2010, 18:01
se, sarà solo ed esclusivamente un puntatore di tipo SuperEnalotto che ovviamente non starà puntando un bel niente quindi è giusto che mi dia nullpointer (se avrà valore null), ma se io faccio new SuperEnalotto() e quindi chiamo il costruttore della classe lui non dovrebbe inizializzarsi o sbaglio?
banryu79
03-11-2010, 18:22
se, sarà solo ed esclusivamente un puntatore di tipo SuperEnalotto che ovviamente non starà puntando un bel niente quindi è giusto che mi dia nullpointer (se avrà valore null), ma...
Ok, è corretto.
Per inciso, il fatto che 'se' dopo questa istruzione:
SuperEnalotto se;
vale null, ovvero come se avessimo invece eseguito questa istruzione:
SuperEnalotto se = null;
è dovuto al fatto che ogni variabile (di tipo primitivo o reference) dichiarata nel codice viene sempre inizializzata ad un valore di default a tempo di esecuzione dalla virtual machine.
In particolare, il valore di default delle reference come ormai hai capito è null.
Quindi dobbiamo valorizzare 'se', il che ci porta al punto seguente...
...ma se io faccio new SuperEnalotto() e quindi chiamo il costruttore della classe lui non dovrebbe inizializzarsi o sbaglio?
Certo.
Il problema non può quindi essere questo, dato che inzializzi 'se' con un nuovo oggetto SuperEnalotto.
Quando eseguo questa istruzione:
SuperEnalotto se = new SuperEnalotto();
'se' esite e ha un valore non nullo; ma per "quanto tempo" esiste 'se' in memoria?
E qui bisogna affrontare la questione dello "scope" (visibilità) delle istanze create i memoria.
Però sto staccando e volo a casa... stasera non sono online ti lascio nelle mani di eventuali altri utenti, almeno fino a domattina :P
loop4633
03-11-2010, 18:29
Grazie infinite :) leggerò qualcosa e proverò a darti una risposta :D
loop4633
03-11-2010, 19:28
Ma io non capisco una cosa, le istanze in memoria riferite ad un oggetto non dovrebbero essere rimosse quando questo muore?
Non capisco il nesso con il mio problema... :muro:
Il tuo problema l'hai scovato, ossia "se" era null perchè non l'avevi stanziato.
Ma facendo come hai fatto hai solo aggirato il problema, tu crei una istanza di "SuperEnalotto" dentro la classe "SuperEnalotto" e chiami il metodo generator di quella istanza, aspettandoti che invece venga riempita la jTextArea dell'istanza dalla quale premi il pulsante. Scusami ma io mi esprimo veramente da cani quindi non mi aspetto che si capisca quello che dico.
In poche parole ripassati l'uso del "this" e vedrai che arriverai alla soluzione subito.
loop4633
03-11-2010, 20:17
del this non è che ci sia molto da ricordare semplicemente come in c++ richiama l'oggetto stesso, ma io non capisco dove ho bisogno di richiamare l'oggetto? e sopratutto che succede? perchè non mi da errore e non mi fa vedere il risultato?
come actionPerformed ho lasciato questo
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
SuperEnalotto se=new SuperEnalotto();
se.generator();
}
del this non è che ci sia molto da ricordare semplicemente come in c++ richiama l'oggetto stesso, ma io non capisco dove ho bisogno di richiamare l'oggetto? e sopratutto che succede? perchè non mi da errore e non mi fa vedere il risultato?
come actionPerformed ho lasciato questo
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
SuperEnalotto se=new SuperEnalotto();
se.generator();
}
Non c'è molto da ricordare ma bisogna averlo capito, prova a mettere this.generator() e vedi che succede.
loop4633
03-11-2010, 20:31
mi scrive un null e poi i 10 numeri come programmato, invece se utilizzo StringBuilder mi da 10null tutti attaccati, cmq dovrei capire intanto il perchè col this funziona e se uso l'istanza no, e poi magari vedere pure perchè stampa un null prima dei numeri...
mi scrive un null e poi i 10 numeri come programmato, invece se utilizzo StringBuilder mi da 10null tutti attaccati, cmq dovrei capire intanto il perchè col this funziona e se uso l'istanza no, e poi magari vedere pure perchè stampa un null prima dei numeri...
Ti stampa null all'inizio semplicemente perchè inizializzi res=null nel costruttore.
Cambia in res="" e hai risolto.
Mentre il problema con StringBuilder è probabilmente perchè stai sbagliando ad usarlo.
Comunque concordo, prima devi capire perchè dovevi usare il this, e poi pensare al resto. E consiglio mio, per ora lascia perdere il database, primi devi far tue certe nozioni.
loop4633
03-11-2010, 20:57
grazie 1000 per l'aiuto :D
loop4633
03-11-2010, 23:08
Ho letto un post su questo forum molto chiaro, in sostanza devo usare spesso il this in java serve per far chiarezza, in poche parole serve per far capire all'istanza dell'oggetto che a lei stessa appartiene il metodo...
grazie a tutti e due :)
Ho letto un post su questo forum molto chiaro, in sostanza devo usare spesso il this in java serve per far chiarezza, in poche parole serve per far capire all'istanza dell'oggetto che a lei stessa appartiene il metodo...
grazie a tutti e due :)
Serve per far chiarezza quando puoi evitare anche di metterlo, infatti potevi benissimo scrivere anche solo generator() senza this, ma è il fatto che hai creato un'altra istanza di SuperEnalotto che non va bene, è il concetto che c'è dietro.
loop4633
04-11-2010, 09:49
Da quello che so io, e per quello che ho letto ieri sera, non è il fatto che avevo creato un'altra istanza, ma semplicemente quella che avevo creato non si riconosceva nella chiamata generator(). Correggetemi se sbaglio. Non mi importa avere la soluzione, mi serve capire se c'è qualche concetto sbagliato, per questo vi ringrazio tanto.
Ps: sapete dirmi come faccio per far in modo che quando premo invio si prema il pulsante generator?
loop4633
04-11-2010, 10:12
Risolto il pulsante bastava un keyPressed :D
Da quello che so io, e per quello che ho letto ieri sera, non è il fatto che avevo creato un'altra istanza, ma semplicemente quella che avevo creato non si riconosceva nella chiamata generator(). Correggetemi se sbaglio. Non mi importa avere la soluzione, mi serve capire se c'è qualche concetto sbagliato, per questo vi ringrazio tanto.
Ps: sapete dirmi come faccio per far in modo che quando premo invio si prema il pulsante generator?
Si sbagli.
Il problema è che hai creato un'altra istanza, e hai chiamato il metodo generator di quella istanza.
Considerando che la tua classe è un JFrame, te hai quindi creato un'altra finestra, se facevi un se.setVisible(true) avresti quindi visto un ulteriore finestra, con la textArea correttamente riempita.
Intesi ora?
loop4633
04-11-2010, 13:21
Scusami ma ho la testa dura, allora se io faccio
SuperEnalotto se; // Creo un'istanza di un oggetto di tipo SuperEnalotto
ma se dopo io faccio
se.generator();
non dovrei chiamare la funzione generator sempre con quell'istanza?
Per questo penso di aver creato una sola istanza.
Ricapitolando, stai eseguendo del codice nell'actionPerformed di un JButton che si trova DENTRO il frame SuperEnalotto che è attulamente visibile, ed è anche l'unica per ora.
Il codice che vai ad eseguire è:
SuperEnalotto se=new SuperEnalotto();
// stai chiamando generator sulla nuova istanza "se",
//verrà quindi riempita la sua di textarea,
//non quella che attulamente vedi a schermo,
//che invece fa parte dell'istanza riferita con "this"
se.generator();
//per ora se è invisibile ma se fai
//se.setVisible(true); diventa visibile e vedrai due finestre
Come vedi stai creando un ULTERIORE istanza di SuperEnalotto, e lo stai facendo dentro a SuperEnalotto stessa.
Hai quindi creato due finestre, una dove sei attualemente dentro, che viene creata nel main(), e una quando hai premuto il pulsante.
Prima di proseguire con java ti consiglio di rifarti un'altra bella ripassata partendo dalle basi basi, altrimenti non vai molto avanti.
banryu79
04-11-2010, 18:39
Prima di proseguire con java ti consiglio di rifarti un'altra bella ripassata partendo dalle basi basi, altrimenti non vai molto avanti.
Per riportarlo in carreggiata bisognerebbe spiegargli la faccenda dello scope... e poi proseguire un passettino alla volta; purtroppo tra ieri e oggi ho trovato poco tempo per il forum perchè al lavoro sono in un periodo di tirate epocali.
In effetti anche io penso che farebbe prima a prendere un bel libro sul linguaggio e ripassare le basi, che stare qui ad aspettare noi :D
loop4633
04-11-2010, 18:46
che libro mi consigliate? veloce e pratico, senza troppe salse inutili.
loop4633
04-11-2010, 18:50
Ricapitolando, stai eseguendo del codice nell'actionPerformed di un JButton che si trova DENTRO il frame SuperEnalotto che è attulamente visibile, ed è anche l'unica per ora.
Il codice che vai ad eseguire è:
[code]
SuperEnalotto se=new SuperEnalotto();
// stai chiamando generator sulla nuova istanza "se",
A questo punto mi viene spontaneo chiedere, ma sto benedetto metodo viene richiamato automaticamente una volta istanziato l'oggetto?
non devo fare nomeoggetto.metodo per chiamarlo?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.