我已经尝试了很长一段时间才能完成这项工作并做了大量的研究,但我无法弄清楚为什么它没有发生:我的最终目标是通过y绿色正方形得到x的网格,并且当你点击一个正方形时,它会改变颜色。 (这是一个更大项目的一部分)
现在我知道这可能是一种非常低效的方式,但我尝试了不同的方式,似乎没有任何工作。
在我的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();
}
}
}
然而,当我运行代码时,我看到的只是第一个方块和最后一个方块;怎么来的?
如果您有任何关于如何更有效地完成此任务的提示,请告诉并批评此代码。
答案 0 :(得分: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]);
}
}