2012-03-30 5 views
1

Mein Code richtet ein 6x6 Array von JButtons ein, wenn Sie eines dieser JButtons drücken, erscheint eine 6x1 JDialog Box mit 6 Farboptionen. Wenn einer davon gedrückt wird, ändert sich das Quadrat, das zum Öffnen des JDialogs geöffnet wird, ändert seine Farbe.java color grid issues

Ich möchte ein Stück Code schreiben, so dass Sie in jeder Zeile/Spalte nur ein Quadrat jeder Farbe haben können. Im Minut-Modus verhindert der boolesche Wert, dass Sie dieselbe Farbe auf dasselbe Quadrat setzen (wenn Sie zum Beispiel auf die Schaltfläche klicken, wird sie schwarz, wenn sie eine andere Farbe hat).

der Code ist unten. jede Hilfe wird sehr geschätzt. Dank

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import java.sql.*; 
public class Grid5 extends JFrame implements ActionListener 
{ 
     private ColourChooser paintBox = null; 
     public static final int ROW = 6; 
     public static final int COLUMN = 6; 
     private static Grid5 grid; 
     public static final String defaultName = "Black"; 
     public JButton[][] buttons; //makes an array called buttons 
     public static void main(String[] args)// sets up a 6x6 grid 
     { 
      int rows = 6; 
      int cols = 6; 
      int size = 600; 
      Grid5 grid = new Grid5(rows, cols); 
      grid.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      grid.setPreferredSize(new Dimension(size, size)); 
      grid.pack(); 
      grid.setLocationRelativeTo(null); 
      grid.setVisible(true); 
     } 
     // main 
     public Grid5(int rows, int cols) // makes the 6x6 main grid a grid of JButtons 
     { 
      int rowSize = 6; 
      int colSize = 6; 
      int gridSize = 600; 
      buttons = new JButton[rowSize][colSize]; 
      Container pane = getContentPane(); 
      pane.setLayout(new GridLayout(rows, cols)); 
      for(int j =0; j < rows; j++){ 
       for (int i = 0; i < cols; i++) { 
        buttons[j][i] = new JButton(""); 
        buttons[j][i].setOpaque(true); 
        buttons[j][i].setBackground(Color.BLACK); 
        buttons[j][i].setActionCommand(j + " " + i); 
        buttons[j][i].setName("Black"); 
        buttons[j][i].addActionListener(this); 
        pane.add(buttons[j][i]); 
       } 
      } 
     }    //end of grid constructor 

     public void actionPerformed(ActionEvent e) 
     { 
      JButton button = (JButton) e.getSource(); 
      if (paintBox != null && paintBox.isShowing())//stops more than one paintBox from opening 
       paintBox.dispose(); 
      if(e.getSource() instanceof JButton){ 
       ((JButton)e.getSource()).setBackground(Color.BLACK); 
      } 

      int rows = 6; 
      int cols = 1; 
      int size = 300; 
      paintBox = new ColourChooser(grid, false, button); 
      paintBox.setPreferredSize(new Dimension(size/3, size)); 
      paintBox.pack(); 
      paintBox.setVisible(true); 
     } 
} 

class ColourChooser extends JDialog 
{ 
    private JButton fillRed = new JButton("Red"); 
    private JButton fillYellow = new JButton("Yellow"); 
    private JButton fillBlue = new JButton("Blue"); 
    private JButton fillGreen = new JButton("Green"); 
    private JButton fillPurple = new JButton("Purple"); 
    private JButton fillBrown = new JButton("Brown"); 
    private JButton[] paintButton = {fillRed,fillYellow,fillBlue,fillGreen,fillPurple,fillBrown}; 
    private Color[] colours = {Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN, new Color(102, 0, 102), new Color(102, 51, 0)}; 
    private JButton buttonPress; 

    private int buttonsLeftRow ; 
    private int buttonsLeftColumn ; 
    private int row,column; 

    public ColourChooser(final Grid5 frame, boolean isModal, JButton button) 
    { 

     buttonPress = button; 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(6, 1)); 
     for (int i = 0; i < paintButton.length; i++) { 
      paintButton[i].setOpaque(true); 
      paintButton[i].addActionListener(buttonAction); 
      paintButton[i].setForeground(new Color(100,100,100)); 
      paintButton[i].setBackground(colours[i]); 
      panel.add(paintButton[i]); 
     } 
     add(panel); 
     pack(); 
    } 
    private ActionListener buttonAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent a) 
     { 
      JButton fill = (JButton) a.getSource(); 
      if(fill == fillRed){ 
       String colour = "Red"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(Color.RED); 
        buttonPress.setName("Red"); 
        dispose(); 
       } 
      } 
      if(fill == fillYellow){ 
       String colour = "Yellow"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(Color.YELLOW); 
        buttonPress.setName("Yellow"); 
        dispose(); 
       } 
      } 
      if(fill == fillBlue){ 
       String colour = "Blue"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(Color.BLUE); 
        buttonPress.setName("Blue"); 
        dispose(); 
       } 
      } 
      if(fill == fillGreen){ 
       String colour = "Green"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(Color.GREEN); 
        buttonPress.setName("Green"); 
        dispose(); 
       } 
      } 
      if(fill == fillPurple){ 
       String colour = "Purple"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(new Color(102, 0, 102)); 
        buttonPress.setName("Purple"); 
        dispose(); 
       } 
      } 
      if(fill.equals(fillBrown)){ 
       String colour = "Brown"; 
       if(checkColoursRow(colour)){ 
        buttonPress.setBackground(new Color(102, 51, 0)); 
        buttonPress.setName("Brown"); 
        dispose(); 
       } 
      } 
     } 
    }; 

    private boolean checkColoursRow(String colour){ 
     String command = buttonPress.getActionCommand(); 
     String[] array = command.split(" "); 
     int row = Integer.parseInt(array[0]); 
     int column = Integer.parseInt(array[1]); 

     for(int i = 0; i<Grid5.COLUMN; i++){ 
      if (i != row) 
      { 
       if(buttonPress.getName().equals(colour)) 
       return false; 
      } 
     } 


     for (int i = 0; i < Grid5.ROW; i++) 
     { 
      if (i != column) 
      { 
       if (buttonPress.getName().equals(colour)) 
        return false; 
      } 
     } 
     return true; 

     } 
} 
+0

Werfen Sie einen Blick auf diesem [Beispiel] (http://stackoverflow.com/ a/9860374/1057230). –

+0

Dies scheint eine beliebte [Hausaufgabenfrage] zu sein (http://stackoverflow.com/search?tab=newest&q=%5bjava%5d%206x6). – trashgod

Antwort

5

Sie sind fast da, nur ein bisschen von fehlenden Teile

Schritt 1: Sie müssen Referenz zu übergeben Strom Grid5 Objekt an den ColorChooser initialisiert. Dazu Linie

 paintBox = new ColourChooser(grid, false, button); 

zu

 paintBox = new ColourChooser(this, false, button); 

ändern Da die Variable grid nie initialisiert wird, und this den aktuellen Grid5 Objekt bezieht und dass initialisiert wird. Deklarieren eine Variable vom Typ Grid5 in ColourChooser als Grid5 frame;

Schritt 2: im Konstruktor ColourChooser

public ColourChooser(final Grid5 frame, boolean isModal, JButton button)

Assign Parameterrahmen lokale Variable als this.frame = fame

auf diese Weise, Sie haben einen Verweis auf das Raster und seine Schaltflächen in der Farbauswahl

Einmal wird das getan,

Schritt 3: Implementieren Sie eine Methode in Ihrer ColourChooser in ähnlichen Bahnen checkColoursRow zu erreichen, was Sie suchen. Es ist immer gut zu consider naming for methods that return boolean.. Wie Sie vielleicht bemerken, verbessert es die Lesbarkeit und vermeidet Verwirrung.

So kann ein Verfahren wie sein kann (Sie unter Code verbessern können, habe ich eine detaillierte Umsetzung für Klarheit):

private boolean hasColorInRowOrCol(String color){ 
    String command = buttonPress.getActionCommand(); 
    String[] array = command.split(" "); 
    int row = Integer.parseInt(array[0]); 
    int column = Integer.parseInt(array[1]); 
    for(int cols=0; cols < Grid5.COLUMN;cols++) { 
      //frame refers to currently initialized Grid5 object 
     if(frame.buttons[row][cols].getName().equals(color)){ 
      return true; 
     } 
    } 
    for(int rows=0;rows < Grid5.ROW; rows++){ 
      //frame refers to currently initialized Grid5 object 
     if(frame.buttons[rows][column].getName().equals(color)){ 
      return true; 
     } 
    } 
    return false; 
} 

Above Methode funktioniert im Grunde durch aktuelle Zeile/coloumn und prüft, ob die Farbe gesetzt als Name für einen der Knöpfe des Rahmens.

Schritt 4: Letztes Stück ist diese Methode in Ihrem ActionListenerbuttonAction für jeweils unter Beispiel wie in nennen:

JButton fill = (JButton) a.getSource(); 
    if(fill == fillRed){ 
     String colour = "Red"; 
     if(!hasColorInRowOrCol(colour)){ 
      buttonPress.setBackground(Color.RED); 
      buttonPress.setName("Red"); 
      dispose(); 
     } 
    } 
+0

Ich habe hinzugefügt, was Sie sagten, aber ich bekomme einen Fehler, der Bezeichner erwartet, wenn ich die Variable Grid5 Rahmen in Zeile 68 erkläre. Nicht sicher, was es sehr tut mir leid, ich bin nur neu zu Java. – user1296913

+0

Fügen Sie eine Variablendeklaration 'private Grid5 frame;' nach der Zeile, sagen wir, 'private JButton buttonPress;' in der Klasse 'ColourChooser' - haben Sie das getan? –

+0

+1, genau das, woran ich gedacht habe, nette Antwort :-) –