开发者

Java: how to register a listener that listen to a JFrame movement

开发者 https://www.devze.com 2022-12-22 12:27 出处:网络
How can you track the movement of a JFrame itself? I\'d like to register a listener that would be called back every single time JFrame.getLocation() is going to return a new value.

How can you track the movement of a JFrame itself? I'd like to register a listener that would be called back every single time JFrame.getLocation() is going to return a new value.

EDIT Here's a code showing that the accepted answered is solving my problem:

import javax.swing.*;

public class SO {

  开发者_StackOverflow社区  public static void main( String[] args ) throws Exception {
        SwingUtilities.invokeAndWait( new Runnable() {
            public void run() {
                final JFrame jf = new JFrame();
                final JPanel jp = new JPanel();
                final JLabel jl = new JLabel();
                updateText( jf, jl );
                jp.add( jl );
                jf.add( jp );
                jf.pack();
                jf.setVisible( true );
                jf.addComponentListener( new ComponentListener() {
                    public void componentResized( ComponentEvent e ) {}
                    public void componentMoved( ComponentEvent e ) {
                        updateText( jf, jl );
                    }
                    public void componentShown( ComponentEvent e ) {}
                    public void componentHidden( ComponentEvent e ) {}
                } );
            }
        } );
    }

    private static void updateText( final JFrame jf, final JLabel jl ) {
        // this method shall always be called from the EDT
        jl.setText( "JFrame is located at: " + jf.getLocation() );
        jl.repaint();
    }

}


Using addComponentListener() with a ComponentAdapter:

jf.addComponentListener(new ComponentAdapter() {
    public void componentMoved(ComponentEvent e) {
        updateText(jf, jl);
    }
});


JFrame jf = new JFrame();
jf.addComponentListener(new ComponentListener() {...});

is what you are looking for, I think.


You can register a HierarchyBoundsListener on your JFrame, or use a ComponentListener as suggested by others.

jf.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter() {

    @Override
    public void ancestorMoved(HierarchyEvent e) {
        updateText(jf, jl);
    }
});
0

精彩评论

暂无评论...
验证码 换一张
取 消