Java:如何注册侦听JFrame运动的侦听器
如何跟踪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(); } }
JFrame jf = new JFrame(); jf.addComponentListener(new ComponentListener() {...});
我想是你正在寻找的。
将addComponentListener()
与ComponentAdapter
一起使用:
jf.addComponentListener(new ComponentAdapter() { public void componentMoved(ComponentEvent e) { updateText(jf, jl); } });
您可以在JFrame
上注册HierarchyBoundsListener
,也可以按照其他人的建议使用ComponentListener
。
jf.getContentPane().addHierarchyBoundsListener(new HierarchyBoundsAdapter() { @Override public void ancestorMoved(HierarchyEvent e) { updateText(jf, jl); } });