Событие componentResized для компонента в Java, но выполняется только при отпускании мыши - PullRequest
4 голосов
/ 18 июля 2011

Мне нужно сделать некоторые вычисления, когда один из моих компонентов (холст) будет изменен.К сожалению, вычисления могут занять несколько сотен миллисекунд, что приводит к значительному отставанию изменения размера во время выполнения.Я хотел бы решить эту проблему, выполнив только вычисления, когда изменение размера закончилось (я думаю, когда кнопка мыши будет отпущена).Как я могу этого достичь?Пока у меня есть только следующее:

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

Спасибо.

PS: я знаю, что для JFrame событие resized запускается только после отпускания кнопки мыши, но, к сожалению, я не могуположить мой компонент в JFrame или заставить его расширять JFrame.

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

тогда вы можете запустить javax.swing.Timer с некоторой задержкой и только при изменении размера перезапустить таймер и вызывая Action или AbstractAction, вы можете вычислить что угодно и вывести на GUI будет на EDT

0 голосов
/ 19 июля 2011

Я бы сделал 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, если хотите изменить расположение компонента

0 голосов
/ 19 июля 2011

Вы можете установить флаг в componentResized() и иметь MouseListener для реальной работы.

...