2

我已经尝试了很长一段时间来让它发挥作用并进行了大量研究,但我无法弄清楚为什么它没有发生:我的最终目标是得到一个 x x y 绿色方块的网格,当你点击在正方形上它会改变颜色。(这是一个更大项目的一部分)

现在我知道这可能是一种非常低效的方法,但是我尝试了不同的方法,但似乎没有任何效果。

在我的 Grid 类中,我有这个:

    squares = new Square[width][height];
 for (int i = 0; i < width; i++){
    for (int j = 0; j < height; j++){
        squares[i][j] = new Square(i,j);
        frame.getContentPane().add(squares[i][j]);
    }
}

这是我的 Square 课:

public class Square extends JLabel implements MouseListener{

private int x,y,width,height, mouseX,mouseY;
private Color colour = Color.GREEN;


public Square(int width, int height){
this.x = width*45;
this.y = height*45;
addMouseListener(this);
this.setBounds(x, y, 45, 45);
}

public void paintComponent(Graphics g){
   Graphics2D g2 = (Graphics2D) g;
   g2.setColor(colour);
   g2.fillRect(x, y, 45, 45);
}

@Override
public void mouseClicked(MouseEvent e) {
    mouseX = e.getX();
    mouseY = e.getY();
    if(mouseX > x && mouseX < x+45 && mouseY > y && mouseY < y+45){
    if(colour.equals(Color.GREEN)){
        colour = Color.RED;
    } else{
        colour = Color.GREEN;
    }
    repaint();
    }
}

}

但是,当我运行代码时,我看到的只是第一个方块和最后一个方块;怎么会?

如果您有任何提示我可以如何更有效地完成此操作,请告诉并批评此代码。

4

1 回答 1

0

来解决你的问题。您需要在某些地方更改代码。

1) 您不需要使用 Square() 构造函数传递 x、y 坐标。像这样声明空构造函数:

 public Square() {
        addMouseListener(this);
        this.setBounds(x, y, 45, 45);
 }

2) 将 GridLayout 设置为您的 JFrame。

  frame.setLayout(new GridLayout(width, height));

3)在循环中调用空构造函数。

 Square[][] squares = new Square[width][height];
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            squares[i][j] = new Square();
            frame.add(squares[i][j]);
        }
    }
于 2013-09-28T15:40:35.587 回答