Sudoku con GUI

di il
36 risposte

Sudoku con GUI

Sera ^^
Dovrei fare un sudoku con interfaccia GUI. Ho fatto la parte algoritmica, ora la devo trasferire in una tabella.

1) si può fare con la tabella? E come si può fare in modo che alcune celle siano vuote e di un colore diverso e modificabili(editable) e altre no?

2) Se mi conviene invece farlo con i JTextField c'è un modo migliore di inserire ogni numero(tipo con un for) piuttosto che così?
matrice[0][0]= jTextField1;
matrice[0][1]= jTextField2;
matrice[0][2]= jTextField3;
eccetera?

3) la parte grafica la devo fare per forza quadratino per quadratino a mano (Uso JTextField) oppure c'è un modo per crearla attraverso il codice?

4) C'è un modo per aggiungere un timer?

5) Come posso fare un modo che prima del gioco mi appaia una finestra che mi chiede se voglio il gioco facile medio o difficile?

6) come posso fare in modo che cliccando su un bottone mi appaia un'altra finestra(dove metterò i record)?

36 Risposte

  • Re: Sudoku con GUI

    cherry ha scritto:


    1) si può fare con la tabella? E come si può fare in modo che alcune celle siano vuote e di un colore diverso e modificabili(editable) e altre no?
    Tecnicamente sì, sarebbe possibile con JTable. Ma ci sarebbero un po' di problemi in più:
    - Il focus e editing tra le celle (in JTable una cella entra in edit con doppio click o F2, con normali componenti basta spostare il focus o fare 1 click)
    - Il dimensionamento delle celle, ad esempio se vuoi che siano sempre perfettamente "quadrate" c'è un po' di lavoro.
    - In JTable le colonne sono di serie ridimensionabili e "draggabili" (puoi cambiarne l'ordine). Se non lo vuoi, devi fare delle blindature.

    E altre cose minori.

    Ti conviene:
    a) JPanel con un GridLayout che contiene dei JTextField
    oppure
    b) JPanel senza layout manager e con posizionamento "assoluto" dei JTextField

    cherry ha scritto:


    2) Se mi conviene invece farlo con i JTextField c'è un modo migliore di inserire ogni numero(tipo con un for) piuttosto che così?
    matrice[0][0]= jTextField1;
    matrice[0][1]= jTextField2;
    matrice[0][2]= jTextField3;
    eccetera?
    Non serve avere 81 variabili differenti!

    JTextField[][] textfields = new JTextField[9][9];

    Questo istanzia solo l'array bidimensionale ... NON gli 81 singoli JTextField ! Quindi: doppio ciclo for annidato, istanziazione dei JTextField, assegnamento, ecc...

    cherry ha scritto:


    3) la parte grafica la devo fare per forza quadratino per quadratino a mano (Uso JTextField) oppure c'è un modo per crearla attraverso il codice?
    Che vuol dire? È sempre tutto fatto da codice! Se poi usi un editor grafico di GUI ... esso genera codice. Non esiste altro ... da qualche parte ci sarà sempre un es. new JTextField( ... ). Che lo scrivi tu a mano o te lo generi un IDE ... poco cambia.

    A meno che usi librerie/framework di terze parti che creano una GUI a partire da strutturazioni es. in XML o altro. Cosa che comunque non è standard per AWT/Swing.

    cherry ha scritto:


    4) C'è un modo per aggiungere un timer?
    Ci sono diversi timer nel framework (e a parte l'uso diretto dei thread). Dipende cosa ci devi fare e con quali tempistiche (secondi? millisecondi? molto preciso?)

    cherry ha scritto:


    5) Come posso fare un modo che prima del gioco mi appaia una finestra che mi chiede se voglio il gioco facile medio o difficile?
    Principalmente solo questione di layout e di "logica" applicativa.

    cherry ha scritto:


    6) come posso fare in modo che cliccando su un bottone mi appaia un'altra finestra(dove metterò i record)?
    Crei un nuovo es. JFrame con la sua interfaccia grafica. Il punto non è tanto questo ... ma in generale quanto sai di programmazione ad oggetti e quanto sei capace di realizzare un buon design delle classi.
  • Re: Sudoku con GUI

    
    import javax.swing.JTextField;
    
    
    public class Finestra extends javax.swing.JFrame {
    
        private JTextField JTextField1;
    
        public Finestra() {
            JTextField1.setText("perché mi da errore in questa riga?");
            initComponents();
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            jTextField1 = new javax.swing.JTextField();
            jTextField2 = new javax.swing.JTextField();
            jTextField3 = new javax.swing.JTextField();
            jTextField4 = new javax.swing.JTextField();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
            jTextField1.setText("jTextField1");
    
            jTextField2.setText("jTextField2");
    
            jTextField3.setText("jTextField3");
    
            jTextField4.setText("jTextField4");
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(0, 341, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGap(0, 202, Short.MAX_VALUE))
            );
    
            pack();
        }// </editor-fold>                        
    
        public static void main(String args[]) {
    
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Finestra().setVisible(true);
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JTextField jTextField1;
        private javax.swing.JTextField jTextField2;
        private javax.swing.JTextField jTextField3;
        private javax.swing.JTextField jTextField4;
        // End of variables declaration                   
    }
    


    Non capisco perché mi da errore lì. In JTextField1 ci voglio scrivere un numero.
  • Re: Sudoku con GUI

    1)prima devi chiamare initComponents () che "crea" tutto il necessario e poi puoi lavorare con la UI (prima di initComponents () tutte le variabili dovrebbero essere null o non valide)

    2) ricorda che per trasformare un numero in String devi usare String.valueOf ()


    Ciao =)
  • Re: Sudoku con GUI

    Come faccio a fare una matrice di JTextField per non stare a mettere
    jTextField1.setText(m[0][0]+"");
    jTextField2.setText(m[0][1]+"");
    jTextField3.setText(m[0][2]+"");
    jTextField4.setText(m[0][3]+"");
    jTextField5.setText(m[0][4]+"");

    capite?


    private static JTextField tabella[];

    tabella[]={jTextField1, jTextField2};


    non me lo accetta


    lavorare con la UI intendi la GUI?
  • Re: Sudoku con GUI

    Credo che l'unico modo sia istanziare una matrice di JTextField e poi aggiungerli al Container ( se così si chiama, non ho mai lavorato con interfaccie grafiche per java desktop). Ovviamente tutto da codice ( non credo che l'editor grafico che usi possa farlo).

    @andbin cosa proponi?
  • Re: Sudoku con GUI

    Magari mi fareste anche degli esempi di codice? Così magari capisco meglio... scusate
  • Re: Sudoku con GUI

    Un esempio http://www.java2s.com/Tutorial/Java/0240__Swing/CreatingaJTable.htm

    dovresti studiare come implementare un'interfaccia grafica da codice (l'editor grafico dell'IDE infondo genera solo codice java)
  • Re: Sudoku con GUI

    Sono riuscita a fare la tabella di JTextField ma adesso vorrei fare delle semplici linee ogni tre JTextField sia per orizzontale che per verticale (come nel sudoku, capite?) Ho cercato ovunque il codice ma non lo capisco. Mi potete aiutare?
  • Re: Sudoku con GUI

    Qualcuno sa aiutarmi?
  • Re: Sudoku con GUI

    cherry ha scritto:


    Sono riuscita a fare la tabella di JTextField ma adesso vorrei fare delle semplici linee ogni tre JTextField sia per orizzontale che per verticale (come nel sudoku, capite?) Ho cercato ovunque il codice ma non lo capisco. Mi potete aiutare?
    Ogni componente Swing è in grado di gestire un oggetto Border, che rappresenta appunto i bordi del componente (vedi getBorder/setBorder di qualunque componente Swing).

    Dato che il bordo predefinito di JTextField credo non sia "il massimo" visivamente per un sudoku (oltre al fatto che il bordo può variare a seconda del Look&Feel impostato), probabilmente allora ti conviene settare il bordo a tutti i JTextField e in modo oculato. Cioè magari un bordo nero di 1 pixel e ogni 3 campi un bordo nero di 2 pixel.

    Vedi documentazione javadoc, in particolare:
    BorderFactory
  • Re: Sudoku con GUI

    All'inizio mi si apre una finestra così


    clicco su uno dei tre, poi vado su OK e mi si apre la finestra col sudoku (e questo mi funziona)




    Però voglio fare in modo che se ho cliccato su facile le caselle gialline dove dovrò indovinare il numero saranno tipo 20 (come vedete nell'immagine sopra ce ne sono solo due) , se ho cliccato medio saranno 40 e difficile saranno 60... come si fa?
    Ho provato a fare getNumero nella finestra iniziale ma non me lo prende.


    Questo è il codice della finestra iniziale
    public class Iniziale extends javax.swing.JDialog {
    
        FinestraSudoku s;
        private int numero = 0;
    
        public Iniziale(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            initComponents();
        }
    
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
    
            buttonGroup1 = new javax.swing.ButtonGroup();
            jRadioButton1 = new javax.swing.JRadioButton();
            jRadioButton2 = new javax.swing.JRadioButton();
            jRadioButton3 = new javax.swing.JRadioButton();
            jButton1 = new javax.swing.JButton();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    
            buttonGroup1.add(jRadioButton1);
            jRadioButton1.setText("facile");
            jRadioButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jRadioButton1ActionPerformed(evt);
                }
            });
    
            buttonGroup1.add(jRadioButton2);
            jRadioButton2.setText("medio");
            jRadioButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jRadioButton2ActionPerformed(evt);
                }
            });
    
            buttonGroup1.add(jRadioButton3);
            jRadioButton3.setText("difficle");
            jRadioButton3.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jRadioButton3ActionPerformed(evt);
                }
            });
    
            jButton1.setText("OK");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });
    
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addGap(117, 117, 117)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jRadioButton1)
                                .addComponent(jRadioButton2)
                                .addComponent(jRadioButton3)))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(109, 109, 109)
                            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap(131, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(49, 49, 49)
                    .addComponent(jRadioButton1)
                    .addGap(49, 49, 49)
                    .addComponent(jRadioButton2)
                    .addGap(49, 49, 49)
                    .addComponent(jRadioButton3)
                    .addGap(26, 26, 26)
                    .addComponent(jButton1)
                    .addContainerGap(55, Short.MAX_VALUE))
            );
    
            pack();
        }// </editor-fold>                        
    
        private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                              
            numero = 20;
        }                                             
    
        private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                              
            numero = 40;
        }                                             
    
        private void jRadioButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                              
            numero = 60;
        }                                             
       
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            s = new FinestraSudoku();
            this.setVisible(false);
            s.setVisible(true);
    
        }                                        
    
        public static void main(String args[]) {
    
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    Iniziale dialog = new Iniziale(new javax.swing.JFrame(), true);
                    dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                        @Override
                        public void windowClosing(java.awt.event.WindowEvent e) {
                            System.exit(0);
                        }
                    });
                    dialog.setVisible(true);
                }
            });
        }
  • Re: Sudoku con GUI

    Dato che ogni volta che premi il pulsante "OK" istanzi un nuovo FinestraSudoku ..... passargli il numero al costruttore, non ci hai pensato? Che sarebbe la cosa più logica e pulita per come gestisci FinestraSudoku.
  • Re: Sudoku con GUI

    Non ho capito.
    Questo è quello che ho provato a fare ma non va
    (Questa è nela finestra iniziale, quella dove ci sono i JRadioButton "facile " "medio"... )
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            s = new FinestraSudoku(numero);
            this.setVisible(false);
            s.setVisible(true);
    
        }   

    mentre questo è quello che metterei nell'altra finestra
    public class FinestraSudoku extends javax.swing.JFrame(int numero) {
    
        Matrice ma;
        int m[][] = Matrice.getM();
        JTextField t[][] = new JTextField[9][9];
        int numero = 2;
        int v[][] = Matrice.getVuote(numero);
    
        public FinestraSudoku() {
            initComponents();
        }

    ma mi da errore e non so come sistemare.

    Grazie mille andbin che rispondi sempre .
  • Re: Sudoku con GUI

    cherry ha scritto:


    public class FinestraSudoku extends javax.swing.JFrame(int numero) {
    Non è qui che devi dichiarare il parametro .... ma nella definizione del costruttore.

    Cioè qui:
    public FinestraSudoku() {
Devi accedere o registrarti per scrivere nel forum
36 risposte