0

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

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();
    }
}

这与动作侦听器最初调用它的事实有关吗?

4

1 回答 1

3

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

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

于 2012-05-26T14:05:28.523 回答