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

时间:2011-07-18 19:58:11

标签: java events resize components listener

当我的一个组件(一个画布)调整大小时,我需要做一些计算。不幸的是,计算可能需要几百毫秒,这导致调整大小在完成时严重滞后。我想通过仅在调整大小结束时进行计算来解决这个问题(我想当鼠标按钮被释放时)。我怎样才能做到这一点?到目前为止,我只有以下内容:

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

感谢。

PS:我知道对于JFrame,只有在释放鼠标按钮后才会触发resized事件,但遗憾的是我无法将我的Component放入JFrame或扩展JFrame。

3 个答案:

答案 0 :(得分:4)

然后你可以启动javax.swing.Timer一些延迟,并在调整大小时只重启Timer 通过调用Action或AbstractAction,您可以计算任何内容并输出到 GUI将在EDT

答案 1 :(得分:0)

您可以在componentResized()中设置一个标记,并让MouseListener执行实际工作。

答案 2 :(得分:0)

我会像这样做一个MouseListener:

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