Java: как зарегистрировать слушателя, который слушает движение JFrame - PullRequest
3 голосов
/ 11 марта 2010

Как вы можете отслеживать движение самого JFrame? Я хотел бы зарегистрировать слушателя, который будет вызываться каждый раз, когда JFrame.getLocation() будет возвращать новое значение.

РЕДАКТИРОВАТЬ Вот код, показывающий, что принятый ответ решает мою проблему:

import javax.swing.*;

public class SO {

    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();
    }

}

Ответы [ 3 ]

8 голосов
/ 11 марта 2010

Использование addComponentListener() с ComponentAdapter:

jf.addComponentListener(new ComponentAdapter() {
    public void componentMoved(ComponentEvent e) {
        updateText(jf, jl);
    }
});
6 голосов
/ 11 марта 2010
JFrame jf = new JFrame();
jf.addComponentListener(new ComponentListener() {...});

это то, что вы ищете, я думаю.

1 голос
/ 11 марта 2010

Вы можете зарегистрировать HierarchyBoundsListener на своем JFrame или использовать ComponentListener в соответствии с рекомендациями других.

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

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