我做了一个小程序,就像旧的时尚颜料。一切工作到目前为止没有任何问题,但现在我已经尝试实现了一个矩形抽屉,这样当一个按钮被按下绘制一个矩形,下一次按下并释放鼠标按钮将绘制一个矩形,而不是通常只画一个特定颜色的标签。
我有一个类像素,它存储一个标签和一些其他的东西,比如坐标。
我在二维数组中有一堆这样的像素对象,然后将它们添加到gridlayout中。
我有一个包含所有侦听器的控制器类,我有一个很大的方法,在其中我添加了writer侦听器,这是一个mouseadepter,它实现了mousepressed、mousereeased和mouseentered。
现在当你画一个矩形的时候,你需要按下一个按钮来激活它,它会触发一个布尔值,我用它来做这个和那个。
然而,现在当我使用这个函数时,会发生这样的情况:我在按下鼠标时得到正确的标签,例如在x=4,y=4的位置。但是当我把鼠标拖远一点,然后松开鼠标,我在相同的位置得到相同的标签x=4,y=4。
我试过,但这些在不同的听众现在在不同的方法,并呼吁他们都在程序开始前,但知道分裂。
这里是以前的方法,现在只是分为3种不同的方法。每个事件一个,但看起来相同:
public void setUpLabelWriterListener(){
for (int i = 0; i < window.getRow(); i++){
for (int j = 0; j < window.getCol(); j++){
int finalI = i;
int finalJ = j;
MouseAdapter writer = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if(rectangleMode){
pressed = true;
startGrid = new Grid(window.getPixels()[finalI][finalJ].getGrid());
System.out.println("Start: " + startGrid.getRow() + " - " + startGrid.getCol());
}
else {
pressed = true;
window.getPixels()[finalI][finalJ].getPixel().setBackground(color);
window.getPixels()[finalI][finalJ].setPainted(eraserMode);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(rectangleMode){
pressed = false;
endGrid = new Grid(window.getPixels()[finalI][finalJ].getGrid());
System.out.println("End: " + endGrid.getRow() + " - " + endGrid.getCol());
window.writeRectangle(startGrid, endGrid, color);
}
else pressed = false;
}
@Override
public void mouseEntered(MouseEvent e) {
if (!rectangleMode && pressed){
window.getPixels()[finalI][finalJ].getPixel().setBackground(color);
window.getPixels()[finalI][finalJ].setPainted(eraserMode);
}
}
};
window.getPixels()[finalI][finalJ].getPixel().addMouseListener(writer);
}
}
}
这些打印到控制台的坐标是相同的,这是令人费解的一点。
暂无答案!
目前还没有任何答案,快来回答吧!