Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di mist3r0
    Registrato dal
    Mar 2007
    Messaggi
    103

    [java...deserializzazione Jframe]

    CIAO A TUTTI, STO REALIZZANDO UN GIOKINO IN JAVA.

    HO FATTO SI CHE SI POTESSE SALVARE LA PARTITA IN CORSO, MA DURANTE IL CARICAMENTO DELLA PARTITA SALVATA (DESERIALIZZAZIONE) HO UN PICCOLO PROBLEMA CHE NON SONO RIUSCITO A RISOLVERE.

    IL FATTO č CHE DOPO AVER DESERIALIZZATO L'OGGETTO, VADO A LANCIARE UN METODO DI ESSO PER FARLO RIPARTIRE, PASSANDOGLI UN THREAD.

    SE FACCIO QUESTA OPERAZIONE L'APPLICZIONE RIPARTE, MA IL FRAME, QUINDI L'INTERFACCIA GRAFICA SI BLOCCA E NON MI FA VEDERE NIENTE TRANNE I BORDI DEL FRAME.

    SE INVECE NON PASSO IL THREAD, MI FA VEDERE L'INTERFACCIA GRAFICA, MA NATURALEMNTE L'APPLICAZIONE NON FUNZIONA.

    PERCHč TUTTO QUESTO?

    VI SPOSTO IL CODICE dove effettuo la deserializzazione, AIUTATEMI HA TROVARE UNA SOLUZIONE:

    NB: b2 č un JButton

    b2.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){

    ObjectInputStream objin=null;
    FileInputStream in =null;
    //Object temp=null;
    Tavolo temp=null;
    File f=null;
    chooser =new JFileChooser();
    try{
    UnoFilter filtro = new UnoFilter();
    chooser.setFileFilter(filtro);
    chooser.setCurrentDirectory(new File("C:\""));
    int response = chooser.showOpenDialog(null);
    if (response == JFileChooser.APPROVE_OPTION) {
    f = (File) chooser.getSelectedFile();
    if (f == null || f.getName().equals("")) JOptionPane.
    showMessageDialog(null, "Nome File Non Valido",
    "Nome File Non Valido",
    JOptionPane.ERROR_MESSAGE);
    chooser.setMultiSelectionEnabled(false);
    chooser.setFileSelectionMode(JFileChooser.FILES_ON LY);
    in = new FileInputStream(f);
    objin = new ObjectInputStream(new FileInputStream(f));
    //ObjectInputStream ob=new ObjectInputStream(objin);
    System.out.print("obj caricato");
    temp = (Tavolo)objin.readObject();
    System.out.print("obj letto");
    objin.close();
    System.out.print("buffer kiuso");
    temp.setVisible(true);
    Thread t=new Thread();
    int primo=temp.getPrimo();
    temp.giocaPartita(primo,t);


    System.out.print("ok");
    }
    }
    catch(Exception exc1){exc1.printStackTrace();}

    }
    });
    M|$T3RŪ

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Posta il metodo giocaPartita().

  3. #3
    Utente di HTML.it L'avatar di mist3r0
    Registrato dal
    Mar 2007
    Messaggi
    103
    ecco ilmetodo gioca partita....

    public void giocaPartita(int primo, Thread th){

    try {
    Thread.sleep(2000);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }

    int incr = 1;
    int i = primo;

    current = scartaPrima(giocatori[i]);
    if (current.getSimbolo().equals("+4CambiaColore") ||
    current.getSimbolo().equals("CambiaColore")) {
    JOptionPane.showMessageDialog(Tavolo.this,
    "Il colore scelto da " + giocatori[i].getName() +
    " č: " + current.getColore());
    }

    partita.addCartaScartate(current);
    this.repaintTavolo(i);

    boolean operazioneEseguita = false;
    Thread tr=new Thread();
    while (true) {

    try {
    int tempo=(int)(Math.random()*2000)+2000;
    Thread.sleep(tempo);
    }
    catch (InterruptedException e) {e.printStackTrace();}

    if (!operazioneEseguita && current.getSimbolo().equals("CambiaGiro")) {
    incr = -incr;
    operazioneEseguita = true;
    }

    i += incr;

    if (!operazioneEseguita && current.getSimbolo().equals("Stop")) {
    i += incr;
    operazioneEseguita = true;
    }

    if (i < 0)
    i = 4 + i;

    if (i > 3)
    i = i % 4;
    primo=i;
    Carta c = scarta(giocatori[i]);
    if (c != null) {
    current = c;
    operazioneEseguita = false;
    partita.addCartaScartate(current);
    }

    System.out.print("Carte: ");
    for (int j = 0; j < giocatori.length; j++) {
    System.out.print("" + giocatori[j].getNumCarte());
    }
    System.out.println();
    this.repaintTavolo(i);
    if ( (current.getSimbolo().equals("+4CambiaColore") ||
    current.getSimbolo().equals("CambiaColore")) && c != null) {
    JOptionPane.showMessageDialog(Tavolo.this,
    "Il colore scelto da " +
    giocatori[i].getName() +
    " č: " + current.getColore());
    }
    if (partita.mazzoFinito()) partita.rigeneraMazzo();

    if (giocatori[i].getNumCarte() == 1) {
    AnnunciaUno an = new AnnunciaUno(giocatori[i].getName());
    an.setVisible(true);
    Thread t= new Thread(an);
    t.start();
    }
    if (giocatori[i].getNumCarte() == 0) {
    if (giocatori[0].getNumCarte() == 0) {
    this.dispose();
    //System.exit(0);
    Finestra fin1 = new Finestra(giocatori[0].getName());
    fin1.setVisible(true);
    break;

    }
    else {
    this.dispose();
    //System.exit(0);
    Finestra fin1 = new Finestra(giocatori[i].getName());
    fin1.setVisible(true);
    break;


    }
    }
    }
    }
    M|$T3RŪ

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    In giocaPartita c'e' un while(true). L'actionPerformed (quindi il thread che si occupa dell'interfaccia grafica) si blocca su questa istruzione e l'interfaccia non viene aggiornata. Fai partire quest'istruzione in un thread separato.

  5. #5
    Utente di HTML.it L'avatar di mist3r0
    Registrato dal
    Mar 2007
    Messaggi
    103
    Ho capito il problema ma non come risolverlo...

    Mi spiegheresti meglio, anche con qlke riga di codice cosa intendi per thread separato?
    M|$T3RŪ

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    codice:
    Thread myTh = new Thread() {
       public void run() {
          //istruzioni da far eseguire in parallelo al flusso della classe (nel tuo caso giocaPartita)
       }
    };
    myTh.start();

  7. #7
    Utente di HTML.it L'avatar di mist3r0
    Registrato dal
    Mar 2007
    Messaggi
    103
    Vediamo se ho capito:

    nel metodo dove definisco l'evento devo fare:

    // CODICE...

    oggettodesarializzato.setVisible(true);
    Thread t=new Thread();
    int primo=temp.getPrimo();
    temp.giocaPartita(primo,t);


    Thread myTh = new Thread() {
    public void run() {
    oggettodesarializzato.giocaPartita(primo,myTh);
    }
    };
    myTh.start();


    ho capito bene?
    M|$T3RŪ

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Le prime 4 righe che sarebbero? Cmq continui a chiamare giocaPartita anche fuori dal thread.
    Poi perche' passi un thread a giocaPartita che tanto non lo utilizzi mai nel suddetto metodo?

  9. #9
    Utente di HTML.it L'avatar di mist3r0
    Registrato dal
    Mar 2007
    Messaggi
    103
    oggettodesarializzato.setVisible(true); // questa chiamata devo farla x forza...giusto?

    // poi quello che mi hai detto tu...

    Thread myTh = new Thread() {
    public void run() {
    oggettodesarializzato.giocaPartita(primo,myTh);
    }
    };
    myTh.start();



    al metodo "giocaPartita" per forza devo passare un threadm altrimenti come faccio a far ripartire la partita????????
    M|$T3RŪ

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Ok, allora prima ti erano scappate anche qualche linea del vecchio codice,chiedevo per quello.
    al metodo "giocaPartita" per forza devo passare un threadm altrimenti come faccio a far ripartire la partita????????
    Il metodo giocaPartita fa ripartire la partita. Se viene chiamato sta per forza in un thread. Prima era in quello del flusso principale del programma e quindi bloccava tutto, ora lo abbiamo spostato in un altro thread. Quello che gli passi tu e' inutile, non lo usi ne tantomeno lo fai partire da nessuna parte da quanto vedo.

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.