2010-03-11 4 views
3

JFrame 자체의 움직임을 어떻게 추적 할 수 있습니까? 매번 다시 호출 할 청취자를 등록하고 싶습니다. JFrame.getLocation()이 새로운 값을 반환 할 것입니다.자바 : JFrame의 움직임을 듣는 리스너를 등록하는 방법

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

} 
+0

참고 JFrame의 위치가 변경 될 때마다 트리거 될 수 있으며 코드 조각은 정답을 연결하는 개념 증명의 역할을하는 간단한 해킹 일뿐입니다. – cocotwo

답변

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

당신이 찾고있는 무엇을, 나는 생각한다. ComponentAdapteraddComponentListener()를 사용

1

당신은 당신의 JFrameHierarchyBoundsListener를 등록하거나 다른 사람에 의해 제안으로 ComponentListener를 사용할 수 있습니다

편집는 여기가 내 문제를 해결한다 대답 받아 들여지는 것을 보여주는 코드입니다.

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

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

:이 OO 디자인에 대한 나 사용 또는 * 마지막 * 등의 문제는 콜백을 등록하는 방법에 관한 비 사용에 대한 질문이 아니라고

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

+1 : 링크와 작업 예를 제공 한 이후 귀하의 답변을 수락했을 것입니다. :) –

+0

@ mmyers : 고마워, +1 – cocotwo

+0

가장 먼저 답변을 수락했으면 받아 들였을 것입니다. API에 대한 링크를 제공 할 필요가 없습니다. 대답은 ComponentListener를 사용하는 것입니다. 모든 프로그래머는 API에 직접 액세스해야하며이를 사용하는 방법을 알아야합니다. 링크를 제공하려면 "구성 요소 수신기 작성 방법"의 스윙 튜토리얼을 참조하십시오. 그런 식으로 포스터가 보일 때 다른 모든 Swing 이벤트 리스너를위한 리스너를 작성하는 방법에 대한 섹션도 찾을 수 있습니다. 사람들이 항상 문제를 해결할 도구를 제공 할 수있게 해줍니다. – camickr