2017-11-15 3 views
0

내부에 여러 JPanels가 포함 된 JFrame 인 잠금 화면 프로그램을 만들려고했습니다. 각 패널 (Cell) 클래스에 MouseMotionListener를 추가했습니다. 사용자가 마우스를 드래그하여 여러 셀로 드래그 할 수 있도록하고 싶습니다. 문제는 MouseEvent.GetSource (셀에 캐스트)가 드래그가 시작된 셀만 반환한다는 것입니다. 여기 내 코드가있다.MouseDragged에있는 MouseMotionListener 구성 요소를 시작합니다. 드래그 시작

public class Cell extends JPanel { 

    public String name; 

    public Cell(String name, Color color) { 
     this.name = name; 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       onMouseOver(e); 
      } 
     }); 
     setBackground(color); 
     setVisible(true); 
     repaint(); 
    } 

    private void onMouseOver(MouseEvent e) { 
     System.out.println(name); 
    } 
} 
+0

"여러 셀로 드래그"에 대해 설명해 주시겠습니까? – Berger

+0

@Berger 나는 한 셀에서 다른 셀로 마우스를 드래그하는 것을 의미합니다. – AcePilot10

+0

드래그 동작 중에 마우스를 올려 놓은 모든 세포를 원하십니까? – Berger

답변

0

문제 MouseEvent.GetSource은 (a 셀 캐스트)만을 드래그 올

에서 시작 셀 반환된다는 것이다. 모든 이벤트는 드래그가 시작될 때 클릭 한 셀을 기준으로합니다.

현재 어떤 셀인지 알고 싶다면 직접 계산해야합니다.

따라서 MouseEvent의 getPoint() 메서드를 사용하고 끝난 구성 요소를 계산할 수 있습니다.

예를 들어 SwingUtilities.convertPoint(...) 방법을 사용하여 포인트를 부모 컨테이너로 변환 할 수 있습니다.

부모 컨테이너에 상대적인 포인트를 얻은 후에는 Container.findComponentAt(...) 메소드를 사용하여 컨테이너에서 현재 구성 요소를 찾을 수 있습니다.

찾을 수있는 모든 구성 요소를 추적해야합니다. 어쩌면 구성 요소를 Set에 추가하십시오.

또는 모든 셀에 리스너를 추가하는 대신. 부모 패널에 리스너를 추가하기 만하면됩니다. 그러면 모든 포인트가 패널에 상대적이되므로 포인트를 변환 할 필요가 없으므로 findComponentAt(...) 로직을 수행하면됩니다.

+0

findComponentAt 메서드를 사용하고 있으며 완벽하게 작동합니다! 도와 주셔서 감사합니다! – AcePilot10

관련 문제