2012-03-16 54 views
5

Actualmente estoy trabajando en mi GUI para este solucionador de Sudoku que estoy haciendo. Logré imprimir el tablero sin problemas. Sin embargo, me gustaría saber cómo iría para diferenciar las regiones 3x3 con algún tipo de línea más gruesa o de color.Sudoku GUI usando java

Básicamente algo parecido a la imagen siguiente.

sudoku

A continuación se muestra el código que ya haya implementado. ¡Gracias!

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

Ver también [ 'CellTest'] (http: // stackoverflow. com/a/4151403/230513). – trashgod

Respuesta

6

Con mucho, la forma más fácil sería utilizar nueve 3x3 JPanel s de JLabel s anidados en un gran 3x3 JPanel de JPanel s. Entonces podrías simplemente aplicar bordes especiales a los pequeños 3x3.

+3

Todavía no entiendo cómo puedo hacer esto. Lo busqué en línea y todo lo que puedo encontrar es tableros de comandos. Parecen estar utilizando instrucciones modulo 3 para que se destaquen más. ¿No hay una manera similar para JLabels que sería más fácil y más corta de hacer? – kompsci

1

Aquí hay un código de muestra de Yahoo Answers! sobre cómo se podría añadir 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); 
} 
} 

No se pudo publicar esto en un comentario sin tener todo en mal estado.

3

¿Qué pasa si creaste tu propio JPanel personalizado para mantener un dígito y dibujar un borde negro, y luego un JPanel personalizado para mantener una grilla de esos?

Ejemplo de encargo 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 } 

    } 

Ejemplo de encargo rejilla 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)); 

     } 

    } 

código Ejemplo:

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