Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: Sincronizzazione

  1. #1
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319

    Sincronizzazione

    Salve,
    ho una classe, chiamiamola A, in un metodo di questa istanzio un'altra classe, chiamiamola B, il cui costruttore provvede a creare una finestra che richiede l'interazione con l'utente (immissione di parametri e pressione su un tasto di OK) e a richiamare successivamente a tale interazione altri metodi della stessa classe B.
    Ho quindi questa situazione:
    Codice PHP:
    public metodoDiA() {
    ...
    istruzioni X;
    istanzia la classe B;
    istruzioni z;
    ...
    }

    public 
    B() {
    ...
    creaFinestraConInterazione();
    istruzioni Y;

    Il problema è che quando istanzio la classe B, l'esecuzione di metodoDiA() continua prima che sia giunto a termine tale istanziazione, in altre parole vengono interfogliate istruzioni del costruttore di B con le "istruzioni Z".
    Probabilmente ciò è dovuto alla suddetta interazione con l'utente!
    L'intero programma si compone di un unico thread...quindi il comportamento è abbastanza anomalo

    Come posso fare per far si che le "istruzioni z" siano eseguite ESCLUSIVAMENTE dopo la completa esecuzione del costruttore di B (cioè dopo le "istruzioni Y")?

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Evidentemente la finestra che apri è un JFrame.
    Devi utilizzare delle JDialog modali.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Originariamente inviato da LeleFT
    Evidentemente la finestra che apri è un JFrame.
    Devi utilizzare delle JDialog modali.
    Ciao.
    Grazie per la risposta Lele, per la precisione la classe B è dichiarata così:

    Codice PHP:
    public class extends Frame implements ActionListener {
    ...

    Devo utilizzare quindi delle JDialog modali?
    Potresti darmi qualche ulteriore informazione su come utilizzarle (non sono molto pratico ), e se è possibile modificare la classe B continuando nello stesso tempo ad utilizzare la sua dichiarazione con Panel, Label, XYLayout, TextField, Button, e quant'altro ?

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da inc40
    Grazie per la risposta Lele, per la precisione la classe B è dichiarata così:

    Codice PHP:
    public class extends Frame implements ActionListener {
    ...

    Devo utilizzare quindi delle JDialog modali?
    Potresti darmi qualche ulteriore informazione su come utilizzarle (non sono molto pratico ), e se è possibile modificare la classe B continuando nello stesso tempo ad utilizzare la sua dichiarazione con Panel, Label, XYLayout, TextField, Button, e quant'altro ?

    Grazie
    Panel, Label, Frame, Button... sono componenti AWT. Se puoi è meglio che usi i corrispettivi SWING.

    http://java.sun.com/docs/books/tutor...omponents.html
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Noto che usi ancora AWT... consiglio spassionato: abbandona AWT e passa a Swing.

    una JDialog (per AWT si chiama Dialog) è anch'essa una finestra, in buona sostanza.

    Se la classe A è anch'essa una finestra (estende Frame o JFrame per Swing) puoi modificare la classe B in questo modo, senza grossi sconvolgimenti di codice:
    codice:
    public class B extends JDialog implements ActionListener {
       public B(A frm) {
          super( frm );
          ...
          setModal( true );
       }
    }
    e di conseguenza, quando istanzi la classe B:

    codice:
    public metodoDiA() {
       B tuaDialog = new B(this);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Originariamente inviato da LeleFT
    Noto che usi ancora AWT... consiglio spassionato: abbandona AWT e passa a Swing.
    ....
    Ciao.
    In pratica sto lavorando ad un vecchio progetto fatto da altri, e devo aggiungere delle funzionalità. Vorrei cercare di non modificarlo troppo...altrimenti mi conviene rifarlo da zero.
    Per quanto riguarda la classe A, è anch'essa una finestra, ma non è stata dichiarata come
    Codice PHP:
    public class extends Frame implements ActionListener {
       ...

    ma è stata dichiarata così:
    Codice PHP:
    public class A{
        
    Frame w = new Frame();
        ... 
    Posso applicare comunque le modifiche che mi dicevi?

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    No: la classe A non è una finestra, però le modifiche da fare sono comunque esigue.
    Invece di istanziare la classe B come nel mio esempio, dovrai passare al suo costruttore il riferimento alla finestra w che viene istanziata all'interno della classe A.

    Io non so di preciso dove venga eseguita questa istruzione:
    codice:
    Frame w = new Frame()
    L'importante è che tu passi quel w alla classe B (puoi, ad esempio, passare un riferimento a w al metodo dove B viene istanziata).

    Se, ad esempio, quell'istruzione viene eseguita nello stesso metodo che tu hai chiamato metodoDiA() puoi benissimo utilizzare questa istruzione:
    codice:
    B tuaDialog = new B( w );
    Altrimenti dovrai fornire w al tuo metodo, in questo modo:
    codice:
    public metodoDiA(Frame w) {
       ...
       B tuaDialog = new B( w );
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Originariamente inviato da LeleFT
    No: la classe A non è una finestra, però le modifiche da fare sono comunque esigue.
    ...
    Ciao.
    Ciao Lele, ho seguito le tue istruzioni e questa è adesso la situazione:
    codice:
    public class A {    // Inizio Classe A - Contenuta nel package1
    Frame w = new Frame();
    ...
    
    
    public A() {
    Panel ...
    Label ...
    Button
    metodoDiA();
    ...
    }
    
    
    metodoDiA() {
    ...
    System.out.println("   ------  1  ---------");
    B miaDialog = new B( w );
    System.out.println("   ------  4  ---------");
    ...
    System.out.println("   ------  5  ---------");
    ...  // Select dal Database
    ...
    }
    
    
    }  // Fine Classe A
    
    
    
    public class B extends JDialog implements ActionListener {    // Inizio Classe B - Contenuta nel package2
    Panel ...
    Label ...
    XYLayout ...
    
    
    public B(Frame w) {
    super(w);
    ...
    setModal(true);
    }
    
    ... //  Altri metodi
    
    public void actionPerformed(ActionEvent e) {
          
    if (e.getActionCommand().toString() == "Ok") {  // Quando clicco sul tasto OK della finestra viene lanciato il metodo connect()
       connect();
    } else {
       this.setVisible(false);
       System.exit(0);
       }
    }
    
    public void connect() {
    ...
    System.out.println("   ------  2  ---------");
    // Connessione al database
    System.out.println("   ------  3  ---------");
    ...
    }
    
    }   // Fine Classe B
    Praticamente una volta istanziata la classe A, vengono stampate le seguenti informazioni:
    ------ 1 ---------
    ------ 4 ---------
    ------ 5 ---------
    Exception in thread "main" java.lang.NullPointerException // Per la Select che fa dal Database, al quale non si è ancora connesso
    ------ 2 ---------
    ------ 3 ---------

    Continua a non funzionare

    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Da quel che vedo non hai esattamente seguito i miei consigli:

    1) Io continuo a non capire dove viene eseguita l'istruzione Frame w = new Frame() (e questo mi impedisce di darti ulteriori informazioni su come procedere...)

    2) Il metodo metodoDiA() non prevede il passaggio di un parametro di tipo Frame (come ti ho suggerito nel precedente post). Questo mi fa supporre che l'istruzione al punto 1 sia contenuta al suo interno... è corretto? Se è corretto allora deve funzionare.

    3) Per l'errore della Select dal database, mi pare ovvio che prima devi richiamare connect() e successivamente potrai fare la select... non certo in ordine inverso.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it L'avatar di inc40
    Registrato dal
    Sep 2004
    Messaggi
    319
    Originariamente inviato da LeleFT
    Da quel che vedo non hai esattamente seguito i miei consigli:

    Ciao.
    Risposte:
    1) Frame w = new Frame() è la prima istruzione nella class A

    2) Passo il parametro w in metodoDiA() scrivendo B miaDialog = new B( w );

    3) E' il problema che devo risolvere


    Grazie
    Gli uomini, non avendo potuto guarire la morte, la miseria, l'ignoranza, hanno risolto, per vivere felici, di non pensarci.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.