Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Grafica per Sudoku

  1. #1

    Grafica per Sudoku

    Salve. Sto realizzando un generatore di Sudoku. Mi sono impuntato su un problema nella realizzazione della grafica. Questo è il codice del JPanel che mostra il Sudoku:

    codice:
    public class SudokuPanel extends JPanel {
        
        private static final long serialVersionUID = 1L;
        private Sudoku sudoku;
    
        public SudokuPanel(Sudoku sudoku) {
            
            this.sudoku = sudoku;
            
            setLayout(new GridLayout(9,9));
            setPreferredSize(new Dimension(600,600));
            setBorder(BorderFactory.createLineBorder(Color.BLACK));
            
            for(int i = 0; i < Sudoku.DIM; i++) {
                for(int j = 0; j < Sudoku.DIM; j++) {
                    MaskFormatter formatter = null;
                    try {
                        formatter = new MaskFormatter("#");
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                    JFormattedTextField formattedTextField = new JFormattedTextField(formatter);
                    Font font = new Font("Serif", Font.BOLD, 45);
                    formattedTextField.setFont(font);
                    formattedTextField.setHorizontalAlignment(JTextField.CENTER);
                    add(formattedTextField);
                }
            }
        }
    }
    I problemi sono 2:

    1) Come tutti saprete la griglia del Sudoku è divisa in 9 aree 3 x 3. Vorrei inserire delle linee nere o dei bordi per mostrare questa suddivisione ma non so come fare.

    2) Devo evitare l'inserimento dello 0 nelle celle.

    Qualsiasi consiglio è ben accetto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    1) Come tutti saprete la griglia del Sudoku è divisa in 9 aree 3 x 3. Vorrei inserire delle linee nere o dei bordi per mostrare questa suddivisione ma non so come fare.
    I componenti di testo in genere hanno già un loro bordo (Border). Basta che lo sostituisci con un Border che ha le linee che vuoi. Se vuoi dare un bordo nero sottile alle celle e poi un bordo più spesso ogni 3, basta che usi un MatteBorder (vedi in BorderFactory). Chiaramente devi fare qualche piccola logica per questo.

    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    2) Devo evitare l'inserimento dello 0 nelle celle.
    Non ci sarebbe nemmeno bisogno di scomodare JFormattedTextField .... basterebbe un semplice JTextField a cui però devi applicare una specie di "filtro" che: a) limiti il testo a max. 1 solo carattere e b) accetti solo caratteri 1...9 (filtrando via qualunque altro). Questo lo si fa abbastanza semplicemente implementando un apposito Document. Cerca sul forum, ne abbiamo già parlato e ho anche qualcosa nei miei Java Examples.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ho questo adesso:

    codice:
    public class SudokuPanel extends JPanel {
        
        private static final long serialVersionUID = 1L;
        private Sudoku sudoku;
    
        public SudokuPanel(Sudoku sudoku) {
            
            this.sudoku = sudoku;
            
            setLayout(new GridLayout(9,9));
            setPreferredSize(new Dimension(600,600));
            setBorder(BorderFactory.createLineBorder(Color.BLACK));
            
            MyTextFieldDocument document = new MyTextFieldDocument(1);
            
            //Crea la griglia
            for(int i = 0; i < Sudoku.DIM; i++) {
                for(int j = 0; j < Sudoku.DIM; j++) {
                    JTextField textField = new JTextField();
                    textField.setDocument(document);
                    Font font = new Font("Serif", Font.BOLD, 45);
                    textField.setFont(font);
                    textField.setHorizontalAlignment(JTextField.CENTER);
                    textField.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
                    if((i == 3 && j < 9) || (i == 6 && j < 9)) { 
                        textField.setBorder(BorderFactory.createMatteBorder(5, 1, 1, 1, Color.DARK_GRAY));
                    }
                    if((j == 3 && i < 9) || (j == 6 && i < 9)) {
                        textField.setBorder(BorderFactory.createMatteBorder(1, 5, 1, 1, Color.DARK_GRAY));
                    }
                    if((i == 3 && j == 3) || (i == 3 && j == 6) || (i == 6 && j == 3) || (i == 6 && j == 6)) {
                        textField.setBorder(BorderFactory.createMatteBorder(5, 5, 1, 1, Color.DARK_GRAY));
                    }
                    add(textField);
                }
            }
        }
    }
    
    
    class MyTextFieldDocument extends PlainDocument {
        
        private static final long serialVersionUID = 1L;
        private int maxlength;
     
        MyTextFieldDocument(int maxlength) {   
            this.maxlength = maxlength;   
        }
    
    
        public void insertString(int offset, String str, javax.swing.text.AttributeSet a) throws BadLocationException {   
            
            Integer integer = Integer.parseInt(str);
                    
            if (integer > 0 && integer < 10 && (getLength() < maxlength)) {   
                super.insertString(offset, str, a);   
            }
        }
    }
    L'unico problema è che se scrivo in una JTextField il numero compare anche in tutte le altre ...
    Ultima modifica di Javino89; 28-02-2014 a 16:49

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da Javino89 Visualizza il messaggio
    L'unico problema è che se scrivo in una JTextField il numero compare anche in tutte le altre ...
    Il "Document" di un componente è ciò che modella il suo contenuto... se tu assegni lo stesso Document a tutte le JTextField, allora tutte avranno lo stesso contenuto.

    Devi creare una istanza di quel Document per ciascuna JTextField.


    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

  5. #5
    Ok ora ho risolto, vi ringrazio

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.