views:

629

answers:

2

When a user clicks on the corner of a JFrame to resize and drags the mouse around, the JFrame redraws based on the current position of the mouse as the user drags. How can you listen to these events?

Below is the what I have currently tried:

public final class TestFrame extends JFrame {
    public TestFrame() {
        this.addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent e) {
                // This is only called when the user releases the mouse button.
                System.out.println("componentResized");
            }
        });
    }

    // These methods do not appear to be called at all when a JFrame
    // is being resized.
    @Override
    public void setSize(int width, int height) {
        System.out.println("setSize");
    }

    @Override
    public void setBounds(Rectangle r) {
        System.out.println("setBounds A");
    }

    @Override
    public void setBounds(int x, int y, int width, int height) {
        System.out.println("setBounds B");
    }
}

How can I determine and constrain how the user resizes a window (based on the current aspect ratio of the window) as they are dragging around the mouse around?

+1  A: 

You can add a component listener and implement the componentResized function like that:

JFrame component = new JFrame("My Frame");

component.addComponentListener(new ComponentListener() 
{  
        public void componentResized(ComponentEvent evt) {
            Component c = (Component)evt.getSource();
            //........
        }
});

EDIT: Apparently, for JFrame, the componentResized event is hooked to the mouseReleased event. That's why the method is invoked when the mouse button is released.

One way to achieve what you want, is to add a JPanel that will cover the whole area of your JFrame. Then add the componentListener to the JPanel (componentResized for JPanel is called even while your mouse is still dragging). When your frame is resized, your panel will also be resized too.

I know, this isn't the most elegant solution, but it works!

Alex
Thanks for the prompt response. However, componentResized only appears to be called when the user releases the mouse button. Is it possible to listen to resize events *as* the user is dragging the mouse?
Clinton
@Clinton True! Sorry about that, I didn't read your question thoroughly!
Alex
@Clinton I was curious of how can this be done, and the only way I found was to add a JPanel in the JFrame. I don't know if this helps you. I've updated my answer.
Alex
Thanks for your revised solution. I gave it a try and it worked well. However, in my case the validate option came out a little cleaner.
Clinton
+1  A: 

You probably need to override something like validate (don't forget to call the super). Of course, that still may not work if you are using a windowing system to configured to drag outlines.

Tom Hawtin - tackline