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();
}
}
}
};
}
}
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.) –