java - MouseListener 无法识别第一次点击

标签 java swing mouseevent paintcomponent

这是我的代码。此代码具有 1 次点击延迟,但我不知道为什么。找不到它以这种方式工作的任何原因。它可以是 ArrayList 或 paintComponent 方法吗?

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;

class PaintWindow {
public void createGUI() {
    JFrame f = new JFrame("My Canvas");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new MyPanel());
    f.setSize(800, 400);
    f.setResizable(false);
    f.setVisible(true);
    f.setLocationRelativeTo(null);
}

}
  class MyPanel extends JPanel {
public Point mousePos;
Timer animTimer;
ArrayList<ObjRectangle> arrForRect = new ArrayList<ObjRectangle>();
ObjRectangle ObjRect1;

public MyPanel() {
    final ActionListener taskPerformer=new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i=0;i<arrForRect.size()-1;i++){
                arrForRect.get(i).animation();
                repaint();
            }
        }
    };

    addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            super.mousePressed(e);
            System.out.println(getMousePosition());
            animTimer=new Timer(100,taskPerformer);
            animTimer.start();
            mousePos = getMousePosition();
            ObjRect1 = new ObjRectangle();
            arrForRect.add(ObjRect1);
            repaint();
        }
    });


}
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if(arrForRect.size()==0){
        return;
    }
    arrForRect.get(arrForRect.size() - 1).drawObject(mousePos);
    for (int i = 0; i < arrForRect.size() - 1; i++) {
        arrForRect.get(i).paintSquare(g);
    }
}  }

class ObjRectangle extends JPanel {
    int x, y = 0;
    int width = 50;
    int height = 20;


    public void drawObject(Point coordinates) {
        this.x = coordinates.x;
        this.y = coordinates.y;
    }

    public void animation() {
        width++;
    }

    public void paintSquare(Graphics g) {
        g.setColor(Color.BLACK);
        g.drawRect(x, y, width, height);
    }
}

public class MainClass {
    public static void main(String[] args) {
    PaintWindow kazo=new PaintWindow();
    kazo.createGUI();
}}

非常感谢任何帮助。

最佳答案

如您的 println 所示,点击检测正常。愚蠢的错误在这里:

for (int i=0;i<arrForRect.size()-1;i++){
    arrForRect.get(i).animation();
    repaint();
}

arrForRect.size()-1当然应该是arrForRect.size()

干杯。

关于java - MouseListener 无法识别第一次点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254718/

相关文章:

java - 将字符串转换为 JInternalFrame

java - 如何在 DefaultTableModel/JTable 中合并单元格?

Java用最大值初始化大数组

Java:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

java - 识别文件扩展名,以不同颜色打印到JTextArea

javascript - 将与选择器相关的变量传递给多个 jQuery 事件

c++ - SendInput - (鼠标移动模拟)

java - 防止 SWT 浏览器元素接收鼠标点击

java - 在 Hibernate3 中的 saveOrUpdateAll 情况下,具有相同标识符值的不同对象已与 session 关联

java - Cassandra = 内存/编码- key 占用空间(哈希/字节[]=>十六进制=>UTF16=>字节[])