当你按下其中一个JButton时,我的代码会设置一个6x6的JButton数组,弹出一个6x1 JDialog框,提供6种颜色选择。当其中一个被按下时,方块点击打开JDialog框改变颜色。
我想写一段代码,这样你就可以在任何行/列中只有一个方格的每种颜色。在minut中布尔我可以阻止你将相同的颜色设置为相同的方块(当你点击它时它会变成黑色,如果它是任何其他颜色)。
代码如下。任何帮助都感激不尽。感谢
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 :(得分:5)
你几乎就在那里,只是有点遗失
第1步:
您需要将当前初始化的Grid5
对象的引用传递给ColorChooser。
为此,请更改行
paintBox = new ColourChooser(grid, false, button);
到
paintBox = new ColourChooser(this, false, button);
因为变量grid
从未初始化,this
引用当前Grid5
对象并且将被初始化。
在Grid5
中声明ColourChooser
类型的变量as
Grid5 frame;
第2步:
在ColourChooser
public ColourChooser(final Grid5 frame, boolean isModal, JButton button)
将参数框架分配给局部变量
this.frame = fame
这样,您可以在颜色选择器中引用Grid及其按钮
一旦完成,
第3步:在ColourChooser
中使用类似的checkColoursRow
行实现一种方法,以实现您的目标。 consider naming for methods that return boolean.总是好的。正如您可能注意到的那样,它提高了可读性并避免了混淆。
所以,一种方法可能就像(你可以改进下面的代码,为了清晰起见,我给出了详细的实现):
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;
}
上述方法基本上通过当前行/ coloumn工作,并检查颜色是否设置为框架的任何按钮的名称。
第4步:
最后一部分是在ActionListener
buttonAction
中调用此方法,如下例所示:
JButton fill = (JButton) a.getSource();
if(fill == fillRed){
String colour = "Red";
if(!hasColorInRowOrCol(colour)){
buttonPress.setBackground(Color.RED);
buttonPress.setName("Red");
dispose();
}
}