>  기사  >  Java  >  드래그 앤 드롭 중에 이벤트 소비를 방지하기 위해 JLabel 마우스 이벤트를 재정의하는 방법은 무엇입니까?

드래그 앤 드롭 중에 이벤트 소비를 방지하기 위해 JLabel 마우스 이벤트를 재정의하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-24 04:50:31819검색

How to Override JLabel Mouse Events to Prevent Event Consumption During Drag and Drop?

드래그 앤 드롭을 위한 JLabel 마우스 이벤트

마우스 이벤트를 재정의하여 JLabel을 통해 드래그 앤 드롭 기능을 구현할 수 있습니다. 그러나 mousePressed 이벤트에서 드래그 앤 드롭을 정의할 때 문제가 발생합니다. 동일한 JLabel에서 mouseReleased 이벤트가 트리거되는 것을 방지하기 때문입니다.

구현:

<code class="java">Thumbnails[I_Loop].setText("1");
Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
    public void mousePressed(MouseEvent me) {
        System.out.println("here mouse pressed");
        JComponent comp = (JComponent) me.getSource();
        TransferHandler handler = comp.getTransferHandler();
        handler.exportAsDrag(comp, me, TransferHandler.COPY);
    }
});</code>

이 예에서 mousePressed 이벤트는 드래그 앤 드롭 프로세스를 시작하는 데 사용되지만 마우스 이벤트를 소비하고 mouseReleased 이벤트가 트리거되는 것을 방지합니다. 결과적으로 "여기 마우스가 출시되었습니다" 메시지가 인쇄되지 않습니다.

대체 접근 방식:

1. TransferHandler 사용:

@Thomas가 언급했듯이 TransferHandler는 드래그 앤 드롭 작업에 사용할 수 있습니다. 드래그 프로세스를 시작하는 내보내기AsDrag()와 같은 메소드를 제공합니다.

2. MouseMotionListener 사용:

이 접근 방식은 마우스를 눌렀다 떼는 이벤트에 의존하는 대신 마우스 드래그 이벤트를 수신하여 구성 요소를 이동합니다.

3. JLayeredPane 사용:

마우스 이벤트를 사용하여 구성 요소를 JLayeredPane 위로 드래그할 수 있습니다. 자세한 내용은 링크된 스택 오버플로 예제를 참조하세요.

개선된 코드:

<code class="java">Thumbnails[I_Loop].setTransferHandler(new TransferHandler("text"));
Thumbnails[I_Loop].addMouseListener(new MouseAdapter() {
    public void  mouseReleased(MouseEvent me) {
           System.out.println("here mouse released");
      }
});
Thumbnails[I_Loop].addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseDragged(MouseEvent e) {
        int dx = e.getX() - mousePt.x;
        int dy = e.getY() - mousePt.y;
        Thumbnails[I_Loop].setBounds(Thumbnails[I_Loop].getX() + dx, Thumbnails[I_Loop].getY() + dy, Thumbnails[I_Loop].getWidth(), Thumbnails[I_Loop].getHeight());
    }
});</code>

이 구현에서는 MouseMotionListener를 사용하여 마우스 드래그 이벤트를 처리하고 이에 따라 JLabel의 위치를 ​​업데이트합니다. 이제 mouseReleased 이벤트가 트리거되고 "여기 마우스가 릴리스되었습니다" 메시지가 인쇄됩니다.

위 내용은 드래그 앤 드롭 중에 이벤트 소비를 방지하기 위해 JLabel 마우스 이벤트를 재정의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.