2012-03-16 16 views
5

Attualmente sto lavorando alla mia GUI per questo risolutore di Sudoku che sto creando. Sono riuscito a stampare il tabellone senza problemi. Tuttavia mi piacerebbe sapere come andrei a differenziare le regioni 3x3 con una sorta di linea più spessa o colorata.GUI di Sudoku che utilizzano java

Fondamentalmente qualcosa di simile alla foto qui sotto.

sudoku

Di seguito è il codice che ho già implementato. Grazie!

Board = new JPanel(new GridLayout(9, 9)); 
    for(int i= 0; i < 9; i++) { 

     for(int j = 0; j < 9; j++) { 

      board[i][j] = new JLabel(); 

      board[i][j].setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 


      Font font = new Font("Arial", Font.PLAIN, 20); 

      board[i][j].setFont(font); 

      board[i][j].setForeground(Color.WHITE); 

      board[i][j].setBackground(Color.WHITE); 


      board[i][j].setOpaque(true); 

      board[i][j].setHorizontalAlignment(JTextField.CENTER); 

      Board.add(board[i][j]); 

     } 
    } 
+1

Vedi anche [ 'CellTest'] (http: // StackOverflow. com/a/4151403/230513). – trashgod

risposta

6

gran lunga il modo più semplice sarebbe quella di utilizzare nove 3x3 JPanel s di JLabel s nidificati in una grande 3x3 JPanel di JPanel s. Quindi potresti semplicemente applicare bordi speciali ai piccoli 3x3.

+3

Ancora non capisco come posso farlo. Ho cercato online e tutto quello che posso trovare sono le bacheche del comando. Sembra che stiano usando dichiarazioni modulo 3 per farle risaltare di più. Non c'è un modo simile per JLabels che sarebbe più facile e più breve? – kompsci

1

Ecco alcuni esempi di codice da Yahoo Answers! su come si potrebbe aggiungere un JPanel a un JPanel

import javax.swing.*; 

public class RecursiveJPanelTest 
{ 
public static void main(String[] arg) 
{ 
JFrame window = new JFrame(); 
JPanel top = new JPanel(); 
JPanel within = new JPanel(); 

window. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

window.setSize(400, 200); 
top.setSize(400, 200); 
within.setSize(400, 200); 

window.add(top); 
top.add(within); 
within.add(new JButton("Button")); 

window.validate(); 
window.setVisible(true); 
top.setVisible(true); 
within.setVisible(true); 
} 
} 

Impossibile pubblicare questo in un commento, senza avere tutto incasinato.

3

Cosa succede se hai creato il tuo JPanel personalizzato per contenere una cifra e tracciare un bordo nero - e poi un JPanel personalizzato per contenere una griglia di quelli?

Esempio personalizzato JPanel:

class SudokuPanel extends JPanel { 

     int digit; //the number it would display 
     int x, y; //the x,y position on the grid 

     SudokuPanel(int x, int y) { 
      super(); 

      this.x = x; 
      this.y = y; 

      /** create a black border */ 
      setBorder(BorderFactory.createLineBorder(Color.black)); 

      /** set size to 50x50 pixel for one square */ 
      setPreferredSize(50,50); 
     } 

     public int getDigit() { return digit; } 

     //getters for x and y 

     public void setDigit(int num) { digit = num } 

    } 

Esempio griglia personalizzata JPanel:

class SudokuGrid extends JPanel { 

     SudokuGrid(int w, int h) { 
      super(new GridBagLayout()); 

      GridBagConstraints c = new GridBagConstraints(); 
      /** construct the grid */ 
      for (int i=0; i<w; i++) { 
       for (int j=0; j<h; j++) { 
        c.weightx = 1.0; 
        c.weighty = 1.0; 
        c.fill = GridBagConstraints.BOTH; 
        c.gridx = i; 
        c.gridy = j; 
        add(new SudokuPanel(i, j), c); 
       } 
      } 

      /** create a black border */ 
      setBorder(BorderFactory.createLineBorder(Color.black)); 

     } 

    } 

codice Esempio:

... 
SudokuGrid sg = new SudokuGrid(3,3); 
myFrame.add(sg); 
...