2012-03-16 15 views
5

Obecnie pracuję nad moim GUI dla tego solv sudoku, który robię. Udało mi się wydrukować tablicę bez żadnych problemów. Chciałbym jednak wiedzieć, jak rozróżnić regiony 3x3 za pomocą grubszej lub kolorowej linii.Sudoku GUI za pomocą java

Zasadniczo coś podobnego do poniższego obrazu.

sudoku

Poniżej jest kod I już wdrożone. Dzięki!

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

Zobacz również [ 'CellTest'] (http: // stackoverflow. com/a/4151403/230513). – trashgod

Odpowiedz

6

Zdecydowanie najłatwiejszym sposobem będzie użycie dziewięciu 3x3 JPanel s o JLabel s zagnieżdżonych w jednym dużym 3x3 JPanel z JPanel ów. Wtedy możesz po prostu zastosować specjalne ramki do małych 3x3.

+3

Nadal nie rozumiem, jak mogę to zrobić. Sprawdziłem online i wszystko, co mogę znaleźć, to tablice wiersza polecenia. Wydaje się, że używają instrukcji modulo 3, aby wyróżniać się bardziej. Czy nie ma podobnego sposobu dla JLabels, który byłby łatwiejszy i krótszy? – kompsci

1

Oto przykładowy kod z Yahoo Answers! w jaki sposób można by dodać do JPanel 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); 
} 
} 

Nie można pisać to w komentarzu bez konieczności to wszystko pomieszane.

3

Co się stanie, jeśli utworzysz własny niestandardowy JPanel, aby pomieścić cyfrę i narysować czarną obwódkę - a następnie niestandardowy JPanel, który będzie utrzymywał taką siatkę?

Przykład niestandardowy 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 } 

    } 

Przykład niestandardowej siatki 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)); 

     } 

    } 

Przykładowy kod:

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