Java中组件的ComponentResistized事件,但仅在释放鼠标时执行

Java中组件的ComponentResistized事件,但仅在释放鼠标时执行,java,events,resize,components,listener,Java,Events,Resize,Components,Listener,当我的一个组件(画布)调整大小时,我需要进行一些计算。不幸的是,计算可能需要几百毫秒,这会导致调整大小在执行时严重滞后。我只想在调整大小结束时(我猜是鼠标按钮松开时)进行计算,从而解决这个问题。我怎样才能做到这一点?到目前为止,我只有以下几点: MyComponent.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) {

当我的一个组件(画布)调整大小时,我需要进行一些计算。不幸的是,计算可能需要几百毫秒,这会导致调整大小在执行时严重滞后。我只想在调整大小结束时(我猜是鼠标按钮松开时)进行计算,从而解决这个问题。我怎样才能做到这一点?到目前为止,我只有以下几点:

MyComponent.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        super.componentResized(e);
        // some calculation
    }       
});
谢谢


PS:我知道对于JFrame,只有在释放鼠标按钮后才会触发调整大小的事件,但不幸的是,我无法将我的组件放入JFrame或让它扩展JFrame。

您可以在
ComponentResistized()中设置标志
并让一个
鼠标听筒
做实际工作。

我会做这样一个鼠标听筒:

public class MouseHandler implements MouseListener
{
    public void mousePressed(MouseEvent e)
    {
        if(!running)
        {
            thread = new Thread(this);
            thread.start();
            running = true;
        }
    }

    public void mouseReleased(MouseEvent e)
    {
        running = false;
        thread = null
    }

    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}

    public void run()
    {
        while(running)
        {
            try
            {
                //repaint the component or move it or somthing.
                Thread.sleep(1000);
                // repaint delay
            }catch(Exception e){e.printStackTrace();}
        }
    }

    Thread thread;
    boolean running;
}

如果您想更改组件的位置,可以插入MouseMotionListener,然后可以启动javax.swing.Timer并延迟一段时间,然后只重新启动计时器 通过调用Action或AbstractAction,您可以计算任何内容并输出到
GUI将在EDT上

为什么要使用
AWT
组件?此外,计算是否与正在进行重新调整大小事件的组件相关?+1,计时器是解决方法。invokeLater()没有帮助。使用计时器时不需要使用invokeLater()。此外,使用计时器的好处是,每次生成组件调整大小事件时,只需继续使用Timer.restart()。将线程与invokeLater()结合使用是另一种需要更多编码的解决方案,因为您需要支持restart()逻辑,因此不应在本回复中建议。这只会混淆海报。如果你认为这是一个好的解决方案,那么你应该发布一个单独的回复。