마우스 이벤트를 재정의하여 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!