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
最终将在一个单独的线程上被调用。