Java多线程鼠标点击

Java多线程鼠标点击,java,multithreading,swing,thread-sleep,mouse-listeners,Java,Multithreading,Swing,Thread Sleep,Mouse Listeners,在根据前一篇文章进行更改之后,我通过引入单/双击识别,进一步执行了以下代码。为什么要在左上角创建球,而不是单击鼠标的位置 bouncingball.java 导入java.awt.BorderLayout; 导入java.awt.Dimension; 导入java.awt.Graphics; 导入java.awt.Toolkit; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.awt.event.Mou

在根据前一篇文章进行更改之后,我通过引入单/双击识别,进一步执行了以下代码。为什么要在左上角创建球,而不是单击鼠标的位置

bouncingball.java
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类BouncingBalls扩展JPanel实现MouseListener{
受保护列表=新的ArrayList(20);
受保护列表垂直球=新ArrayList(20);
私人货柜;
私人帆布;
私有布尔双击=false;
private final Integer waitTime=(Integer)Toolkit.getDefaultToolkit()
.getDesktopProperty(“awt.MultiClick间隔”);
私有静态int canvasWidth=500;
专用静态int画布高度=500;
公共静态最终整数更新率=30;
整数计数=0;
公共静态int随机(int最大范围){
返回(int)Math.round((Math.random()*maxRange));
}
公共弹跳球(整数宽度、整数高度){
画布宽度=宽度;
画布高度=高度;
容器=新容器();
画布=新的DrawCanvas();
此.setLayout(新的BorderLayout());
添加(画布、边框布局、中心);
这个。addMouseListener(这个);
start();
}
公开作废开始(){
线程t=新线程(){
公开募捐{
while(true){
更新();
重新油漆();
试一试{
线程睡眠(1000/更新率);
}捕捉(中断异常e){
}
}
}
};
t、 start();
}
公共无效更新(){
用于(随机球:随机球){
ball.bounce(容器);
}
用于(垂直球:垂直球){
球。垂直弹跳(容器);
}
}
类DrawCanvas扩展了JPanel{
公共组件(图形g){
超级组件(g);
容器图(g);
用于(随机球:随机球){
球。抽签(g);
}
用于(垂直球:垂直球){
球。抽签(g);
}
}
公共维度getPreferredSize(){
返回(新尺寸(画布宽度、画布高度));
}
}
公共静态void main(字符串[]args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JFrame f=新JFrame(“堆栈回答2”);
f、 setDefaultCloseOperation(f.关闭时退出);
f、 setContentPane(新弹跳球(画布高度、画布宽度));
f、 包装();
f、 setVisible(真);
}
});
}
@凌驾
公共无效mouseClicked(MouseEvent e){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标事件(鼠标事件e){
//TODO自动生成的方法存根
}
@凌驾
公共无效mouseExited(MouseEvent e){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标按下(MouseEvent e){
如果(如getClickCount()>=2){
双击=真;
添加(新的垂直球(getX(),getY(),画布宽度,画布高度));
System.out.println(“双击”);
}否则{
计时器计时器=新计时器(waitTime,new ActionListener(){
已执行的公共无效操作(操作事件e){
如果(双击){
/*我们是双击的第一次单击*/
双击=假;
}否则{
计数++;
添加(新的随机球(getX(),getY(),canvasWidth,canvasHeight));
/*第二次点击从未发生过*/
System.out.println(“单击一次”);
}
}
});
timer.setRepeats(假);
timer.start();
}
}
@凌驾
公共无效MouseEvent(MouseEvent e){
//TODO自动生成的方法存根
}
}
java
导入java.awt.Color;
导入java.awt.Graphics;
公开课随机球{
公共静态int随机(int最大范围){
返回(int)Math.round((Math.random()*maxRange));
}
私人INTX;
私营企业;
私人int画布宽度=500;
私人内部画布高度=500;
私有布尔左-右;
私有布尔向上向下;
私人所得税;
德尔泰私人酒店;
私有整数半径=20;
私有整数红色=随机(255);
私有整数绿色=随机(255);
私有整数蓝色=随机(255);
随机球(整数x,整数y,整数宽度,整数高度){
这(x,y,宽度,高度,假,假);
}
随机球(整数x,整数y,整数宽度,整数高度,布尔左右,布尔上下){
这个.x=x;
这个。y=y;
这个.画布宽度=宽度;
这个.画布高度=高度;
this.leftRight=leftRight;
this.upDown=upDown;
updateDelta();
}
公共空间绘制(图g){
g、 setColor(新颜色(红色、绿色、蓝色));
g、 圆角((int)(x-半径),(int)(y-半径),(int)(2*半径),
(int)(2*半径);
}
私有void updateDelta(){
最终整数最小移动=5;
最终整数maxExtra=10;
deltaY=最小移动+(
verticalBalls.add(new VerticalBall(getX(), getY(), canvasWidth, canvasHeight));
public void mousePressed(MouseEvent e) {
    if (e.getClickCount() >= 2) {
        doubleClick = true;
         verticalBalls.add(new VerticalBall(e.getX(), e.getY(), canvasWidth, canvasHeight));
        System.out.println("double click");
    }
}
final int x = e.getX();
final int y = e.getX();
if (e.getClickCount() >= 2) {
    ...
} else {
    Timer timer = new Timer(waitTime, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (doubleClick) {
                /* we are the first click of a double click */
                doubleClick = false;
            } else {
                count++;
                randomBalls.add(new RandomBall(x, y, canvasWidth, canvasHeight));
                /* the second click never happened */
                System.out.println("single click");
            }
        }
    });
    timer.setRepeats(false);
    timer.start();
}