Sudoku con GUI

di il
36 risposte

36 Risposte - Pagina 2

  • Re: Sudoku con GUI

    Oh ti ringrazio molto, adesso funziona. Grazie mille. Mi sa che tornerò per altre domande prima o poi. Grazie ancora ?
  • Re: Sudoku con GUI

    Perché non funziona il timer?
     public void te(){
             while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(FinestraSudoku.class.getName()).log(Level.SEVERE, null, ex);
                }
                tempo[2]++;
                if (tempo[2] == 60) {
                    tempo[1]++;
                    tempo[2] = 0;
                }
                if (tempo[1] == 60) {
                    tempo[0]++;
                }
                jTextField1.setText(tempo[0] + " : " + tempo[1] + " : " + tempo[2]);
           }
        }

    ho cliccato sul customize code del jTextField1 e ho scritto te();
  • Re: Sudoku con GUI

    cherry ha scritto:


    Perché non funziona il timer?
    ho cliccato sul customize code del jTextField1 e ho scritto te();
    Quindi te() viene invocato nel contesto di un es. actionPerformed() o altro evento ? Allora è sbagliato, perché stai tenendo "impegnato" tu il Event Dispatch Thread, e quindi il framework non è in grado di aggiornare la interfaccia utente (che tra l'altro ti risulterà "congelata" e non responsiva).

    Se devi fare cose temporizzate, senza pretese enormi sulla precisione, e ad ogni "tick" del timer devi fare qualcosa sulla UI, allora usa un javax.swing.Timer

    Comunque (ri)vedi bene i concetti sul threading in Swing, perché è importante.
  • Re: Sudoku con GUI

    Avevo provato a metterlo nell'actionPerformed ma non entrava proprio lì dentro. Come faccio a metterlo nell'action performed?

    Poi ho un'altra domanda. Un mio compagno di classe ha detto che non si può mettere la JDialog come finestra iniziale. Ha ragione? Come mai?
  • Re: Sudoku con GUI

    cherry ha scritto:


    Come faccio a metterlo nell'action performed?
    Nel contesto di un actionPerformed() (o qualunque altro evento), NON devi fare operazioni "lunghe" ... sleep o altro, perché altrimenti, lo ripeto, tieni impegnato il EDT e la interfaccia è congelata e non responsiva.

    cherry ha scritto:


    Poi ho un'altra domanda. Un mio compagno di classe ha detto che non si può mettere la JDialog come finestra iniziale. Ha ragione? Come mai?
    No, di per sé è falso. Se guardi tra i (tanti) costruttori di JDialog vedi che ce n'è uno apposito.
  • Re: Sudoku con GUI

    Perché in jTextField1ActionPerformed non ci entra proprio?
  • Re: Sudoku con GUI

    cherry ha scritto:


    Perché in jTextField1ActionPerformed non ci entra proprio?
    In jTextField1ActionPerformed hai messo la invocazione te(); ?

    Ti ripeto che è sbagliato.
  • Re: Sudoku con GUI

    andbin ha scritto:


    cherry ha scritto:


    Perché in jTextField1ActionPerformed non ci entra proprio?
    In jTextField1ActionPerformed hai messo la invocazione te(); ?

    Ti ripeto che è sbagliato.
    no non entra proprio li dentro...
  • Re: Sudoku con GUI

    Comunque allora non so proprio come fare il timer.
  • Re: Sudoku con GUI

    cherry ha scritto:


    no non entra proprio li dentro...
    Se hai in precedenza invocato te() nel contesto di un qualunque altro evento e comunque nel EDT, siccome quel ciclo è continuo e non termina mai, stai perennemente tenendo impegnato il EDT e nessun altro evento potrà essere dispacciato ai listener!

    cherry ha scritto:


    Comunque allora non so proprio come fare il timer.
    Ti ripeto che javax.swing.Timer serve per fare "qualcosa" ripetuto a intervalli di tempo, che sia legato alla interfaccia utente.

    In alternativa, creare un thread a parte, che però richiede altri accorgimenti.
  • Re: Sudoku con GUI

    La prima parte della risposta non l'ho capita, ma non fa niente la vedrò man mano.
    In alternativa, creare un thread a parte, che però richiede altri accorgimenti.
    E come si fa?
  • Re: Sudoku con GUI

    cherry ha scritto:


    la prima parte della risposta non l'ho capita, ma non fa niente.
    No ... questa è proprio una parte che va capita bene!

    cherry ha scritto:


    In alternativa, creare un thread a parte, che però richiede altri accorgimenti.
    E come si fa?
    Creare un thread è facile ... non è quello il problema (tra l'altro dovresti già saperlo se arrivi a Swing). Il punto è che se in un thread che non è il EDT vuoi accedere alla interfaccia utente (qualunque set, get, add ecc... sui componenti), allora bisogna farlo nel modo corretto e con certi accorgimenti ... e ricadiamo proprio nella parte che "non hai capito". Quindi cercherò di dare una breve spiegazione.

    Una applicazione Java può usare quanti thread vuole ma per la gestione della interfaccia utente il thread è uno solo, viene convenzionalmente chiamato EDT (Event Dispatch Thread). Questo thread viene creato e gestito dal framework (di questo non ci si deve preoccupare). Ma devi comunque sapere quali sono le implicazioni di tutto questo.

    Il EDT si occupa di tutta la interfaccia utente, in particolare del disegno dei componenti Swing e del dispacciamento degli eventi (i vari XyzEvent) ai listener registrati sui componenti.
    Tutti i paint/paintComponent dei componenti sono invocati nel contesto del EDT. Pure tutti i metodi dei listener ... actionPerformed, mouseClicked, keyPressed ecc... sono invocati nel contesto del EDT.

    Il EDT gestisce una sua coda degli eventi, man mano che c'è qualcosa "da fare", lo toglie dalla coda e fa il necessario. In pratica è un grosso loop che continuamente e alternativamente disegna, dispaccia eventi, ecc... Sui moderni PC ovviamente è velocissimo ma è comunque un unico flusso di esecuzione e pertanto fa una sola cosa per volta.
    Se sta invocando il actionPerformed di tuo listener ... non sta disegnando un componente ... e viceversa se sta eseguendo il paintComponent di un JButton non sta dispacciando un evento!

    Se tu in un actionPerformed ti metti a fare lunghi loop, sleep di tot secondi e simili, lo stai tenendo impegnato e quindi il framework NON può fare altro, non può aggiornare componenti né dispacciare eventi.

    E non è solo questo: Swing non è thread-safe, ovvero solo nel EDT puoi accedere in modo "sicuro" ai componenti e modificare la interfaccia utente. Nel contesto di altri thread non dovresti farlo. Se lo fai e senza accorgimenti particolari, rischi dal non vedere modifiche fino alla potenziale corruzione di strutture dati o crash causati da eccezioni.
    Ci sono poche operazioni (oltretutto ben documentate) che sono thread-safe e che puoi fare sulla interfaccia utente anche non dal EDT.

    Swing insomma è single-thread. Ci sono ragioni storiche e anche di maggior semplicità per cui le interfacce utente sono in genere single-thread. Questo non è solo per Java/Swing ... vale anche in altri framework/sistemi. Anche Android usa il paradigma della UI single-thread.

    Tutto questo cosa vuol dire? Che il thread della interfaccia utente (in qualunque modo si chiami per convenzione) NON lo devi mai tenere "impegnato" tu troppo a lungo. Fare sleep di secondi, query a database, ecc... in questo thread NON va bene.

    Questo deve essere ben chiaro, se si vuole andare un po' lontano in Swing ...
  • Re: Sudoku con GUI

    Ma ho visto che mi da de lei.. addiriturra XD Ok se preferisce le do del lei anche io.
    Mi sa che chiederò al profe perché non ci sono proprio.
    Grazie per tutta quella pappardella magari un giorno lacapirò.
    Adesso ho un altro problema, che sarebbe il salvataggio su file di testo. Riesco a salvare su file di testo, ma vorrei fare di modo che quando salvo, non sostituisco il file di testo ma aggiungo il salvataggio sotto... Come si fa?
  • Re: Sudoku con GUI

    cherry ha scritto:


    Grazie per tutta quella pappardella magari un giorno lacapirò.
    La DEVI capire, se vuoi sviluppare con Swing.

    cherry ha scritto:


    Adesso ho un altro problema, che sarebbe il salvataggio su file di testo. Riesco a salvare su file di testo, ma vorrei fare di modo che quando salvo, non sostituisco il file di testo ma aggiungo il salvataggio sotto... Come si fa?
    Sui file è perfettamente possibile "appendere" qualcosa al fondo.
    Le classi FileOutputStream e FileWriter (le due adibite alla scrittura su file) hanno dei costruttori con un parametro boolean append, che se è true invece di sovrascrivere il file lo apre in "append" per aggiungere al fondo.

    Se è appropriato l'append, dipende dal contenuto (testo o binario) del file e per i file di "testo" generalmente è appropriato.
  • Re: Sudoku con GUI

    Ho una richiesta strana... si può trasformare una Jlabel in un'immagine?
    La jlabel dove ho fatto la tabella di jtextfield con dentro i numeri del sudoku, vorrei trasformarla in un'immagine... si può?
Devi accedere o registrarti per scrivere nel forum
36 risposte