我有一个方法可以调出一个透明的窗口覆盖,这样我就可以通过点击指示矩形屏幕区域的角点。
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();
}
}
这是否与最初由动作侦听器调用的事实有关?
答案 0 :(得分:3)
您正在屏蔽Event Dispatch Thread。由于将在EDT上调用actionPerformed
方法,因此getClickPoint
中的while循环将阻止EDT处理任何事件(包括您正在等待的鼠标事件),从而导致程序无响应。
如果您需要执行时间昂贵的任务(例如阻止),请查看SwingWorker
。