mousepressed和mousereleased指的是同一个组件

vaqhlq81  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(202)

我做了一个小程序,就像旧的时尚颜料。一切工作到目前为止没有任何问题,但现在我已经尝试实现了一个矩形抽屉,这样当一个按钮被按下绘制一个矩形,下一次按下并释放鼠标按钮将绘制一个矩形,而不是通常只画一个特定颜色的标签。
我有一个类像素,它存储一个标签和一些其他的东西,比如坐标。
我在二维数组中有一堆这样的像素对象,然后将它们添加到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);
            }
        }
    }

这些打印到控制台的坐标是相同的,这是令人费解的一点。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题