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

Java 从按钮调用鼠标事件等待时冻结,java,multithreading,swing,awt,sleep,Java,Multithreading,Swing,Awt,Sleep,我有一种方法,可以打开一个透明的窗口覆盖,这样我就可以通过点击指示屏幕上矩形区域的角点 public Point getClickPoint(){ JFrame frame = new JFrame(""); MyMouseListener mouseL = new MyMouseListener(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setUn

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

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();
    }
}
这与最初由动作侦听器调用有关吗?

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

如果您需要执行耗时的任务(如阻塞),请查看。

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


如果您需要执行耗时的任务(如阻塞),请查看。

这是Swing Timer的作业,独占性。因此,我创建了一个名为
GetPointWorker
的类,该类扩展了
SwingWorker
,其
doInBackground()
任务如上所述。我的方法现在实例化一个新的
GetPointWorker
并调用
doInBackground()
,但它仍然冻结。我的结构是不是非常错误?@skelly你不会直接调用
doInBackground
。您调用
execute
,而
doInBackground
最终将在一个单独的
线程上被调用。这是Swing Timer的作业,独占性地,所以我创建了一个名为
GetPointWorker
的类,它扩展了
SwingWorker
,其
doInBackground()
任务如上所示。我的方法现在实例化一个新的
GetPointWorker
并调用
doInBackground()
,但它仍然冻结。我的结构是不是非常错误?@skelly你不会直接调用
doInBackground
。您调用
execute
,而
doInBackground
最终将在一个单独的
线程上被调用。