从按钮调用鼠标事件等待冻结

时间:2012-05-26 13:58:25

标签: java multithreading swing awt sleep

我有一个方法可以调出一个透明的窗口覆盖,这样我就可以通过点击指示矩形屏幕区域的角点。

public Point getClickPoint(){
        JFrame frame = new JFrame("");
        MyMouseListener mouseL = new MyMouseListener();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        makeTranslucent(frame, Float.valueOf(0.40f));
        frame.setSize(toolkit.getScreenSize());
        frame.setVisible(true);

      frame.addMouseListener(mouseL);
        while(!mouseL.done){
            try {
                Thread.sleep(4);
                } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
 }

当我以正常方式调用它时它工作正常,但是如果我通过按下按钮来调用它,那么它会挂起,不会记录点击并最终冻结。

 Button.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent actionEvent) {
        getClickPoint();
    }
}

这是否与最初由动作侦听器调用的事实有关?

1 个答案:

答案 0 :(得分:3)

您正在屏蔽Event Dispatch Thread。由于将在EDT上调用actionPerformed方法,因此getClickPoint中的while循环将阻止EDT处理任何事件(包括您正在等待的鼠标事件),从而导致程序无响应。

如果您需要执行时间昂贵的任务(例如阻止),请查看SwingWorker