2012-03-28 3 views
3

Ich bin nur neu genug, um Java. Ich versuche, ein 6x6 Raster mit 6 verschiedenen Farben zu füllen, ohne dass die gleiche Farbe in der gleichen Zeile oder Spalte erscheint. In meinem Code habe ich ein 6x6 Raster von JButtons eingerichtet, die in einem Array namens buttons gespeichert sind. wenn ich eines dieser JButtons drücke, wird ein 6x1 Raster von JButtons namens paintBox eingerichtet. Die JButtons in paintBox werden am Anfang des Programms als fillRed, fillYellow usw. deklariert. Wenn ich fillRed drücke, wird die Rückrunde des JButton vom 6x6-Raster rot gesetzt, aber wenn ich einen anderen JButton aus dem 6x6-Raster drücke, versuche ich es zu setzen Gelb zu färben setzt es auf Gelb, setzt aber auch das ursprüngliche JButton, das auf Rot gesetzt wurde, auf Gelb. Jede Hilfe wäre großartig. dankWie stoppen Sie einen ActionListener von früheren Ereignissen erinnern

import javax.swing.*; 
    import java.awt.event.*; 
    import java.awt.*; 
    public class Grid4 extends JFrame implements ActionListener 
    { 
     private ColourGrid paintBox = null; 
     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)}; 
     public static void main(String[] args) // sets up a 6x6 grid 
     { 
      int rows = 6; 
      int cols = 6; 
      int size = 600; 
      Grid4 grid = new Grid4(rows, cols); 
      grid.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      grid.setPreferredSize(new Dimension(size, size)); 
      grid.pack(); 
      grid.setLocationRelativeTo(null); 
      grid.setVisible(true); 
     } 
     // main 
     public Grid4(int rows, int cols) // makes the 6x6 main grid a grid of JButtons 
     { 
      int rowSize = 6; 
      int colSize = 6; 
      int gridSize = 600; 
      JButton[][] buttons; //makes an array called buttons 
      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].setName(""); 
        buttons[j][i].addActionListener(this); 
        buttons[j][i].setBackground(Color.BLACK); 
        pane.add(buttons[j][i]); 
       } 
      } 
     }    //end of grid constructor 

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

      int rows = 6; 
      int cols = 1; 
      int size = 300; 
      paintBox = new ColourGrid(rows, cols,(JButton)e.getSource()); 
      paintBox.setPreferredSize(new Dimension(size/3, size)); 
      paintBox.pack(); 
      paintBox.setVisible(true); 
     } 

     public class ColourGrid extends JFrame 
     { 
      private JButton buttonPress; 

      public ColourGrid(int rows, int cols, JButton button) 
      { 

       buttonPress = button; 
       Container pane = getContentPane(); 
       pane.setLayout(new GridLayout(rows, cols)); 
       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]); 
        pane.add(paintButton[i]); 
       } 
      } 
      private ActionListener buttonAction = new ActionListener() 
      { 
      public void actionPerformed(ActionEvent a) 
      { 
       if(a.getSource() instanceof JButton){ 
        if((JButton)a.getSource()== fillRed){ 
        buttonPress.setBackground(Color.RED); 
        dispose(); 
        } 
        else if((JButton)a.getSource()== fillYellow){ 
        buttonPress.setBackground(Color.YELLOW); 
        dispose(); 
        } 
        else if((JButton)a.getSource()== fillBlue){ 
        buttonPress.setBackground(Color.BLUE); 
        dispose(); 
        } 
        else if((JButton)a.getSource()== fillGreen){ 
        buttonPress.setBackground(Color.GREEN); 
        dispose(); 
        } 
        else if((JButton)a.getSource()== fillPurple){ 
        buttonPress.setBackground(new Color(102, 0, 102)); 
        dispose(); 
        } 
        else if((JButton)a.getSource()== fillBrown){ 
        buttonPress.setBackground(new Color(102, 51, 0)); 
        dispose(); 
        } 
       } 

      } 
     }; 
     } 
    } 
+0

Ich empfehle, einen 'JColorChooser' anstelle von' ColourGrid' zu verwenden. Wenn ein Farbwähler aus irgendeinem Grund ungeeignet ist, setzen Sie das 'ColourGrid' in einen' JDialog', der modal 'true' gesetzt ist. (Und um es gut auszudrücken, benennen Sie es in 'ColorGrid' um, um mit der üblichen Schreibweise in der J2SE übereinzustimmen.) –

Antwort

5

Ihr Problem ist, dass Ihre Farbtasten in der Grid4 Klasse. Jedes Mal, wenn Sie ein neues ColourGrid-Objekt erstellen, fügen Sie dem neuen ColourGrid-JFrame die gleichen Farbschaltflächen hinzu und fügen den gleichen Schaltflächen erneut einen ActionListener hinzu. Jedes Mal, wenn dies geschieht, akkumulieren die JButtons einen anderen ActionListener, und ziemlich bald, wenn eine Farbschaltfläche gedrückt wird, feuern viele ActionListener, alte und neue, und alle Tasten ändern ihre Farbe.

Die Lösung ist die Farbtasten Teil der ColourGrid Klasse haben, nicht die Grid4 Klasse:

public class ColourGrid extends JFrame { 
    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; 

Auf diese Weise jedes Mal, wenn ein neues ColourGrid-Objekt erstellen, wird es neue, frische JButtons mit nur Ein ActionListener ist an jeden einzelnen hinzugefügt, und nur die Farbe der letzten Grid-Schaltfläche ändert sich.

Ansonsten sind alle Empfehlungen, die Andrew Ihnen gab, sehr gute Empfehlungen.

+0

Danke an Sie beide für den Rat, es funktioniert jetzt gut. applyate wirklich die Hilfe. – user1296913

+0

@ user1296913: Gern geschehen –