2012-10-11 1 views
1

드롭 : 여기 드래그 앤 인 JPanel의 드롭 못해 나는 기본적으로 JLabel를 포함하는 JPanel의 드래그 앤 드롭하기 위해 노력하고있어

가 드래그의 샘플입니다 내가 구현 한 코드 드롭 :

public class TestDragAndDropPanel extends JPanel{ 

private static final long serialVersionUID = 1L; 
Border borderContainer = BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLACK); 
private DataFlavor dataFlavor = new DataFlavor(TestDragAndDropPanel.class, "TestDragAndDropPanel"); 


public TestDragAndDropPanel(){ 
      JPanel mainDragPanel = new JPanel(); 
    mainDragPanel.setBorder(borderContainer); 

    JPanel mainDropPanel = new JPanel(); 
    mainDropPanel.setBorder(borderContainer); 

    JPanel draggablePanel = new JPanel(); 
    draggablePanel.setBorder(borderContainer); 
    JLabel draggableTitle = new JLabel("This is Draggable"); 
    JLabel draggableTitle2 = new JLabel("Another Component"); 
    draggablePanel.add(draggableTitle); 
    draggablePanel.add(draggableTitle2); 

    JPanel droppablePanel = new JPanel(); 
    droppablePanel.setBorder(borderContainer); 
    JLabel droppableTitle = new JLabel("This is Droppable"); 
    JLabel droppableTitle2 = new JLabel("Another Component 2"); 
    droppablePanel.add(droppableTitle); 
    droppablePanel.add(droppableTitle2); 

    mainDragPanel.add(draggablePanel); 
    mainDropPanel.add(droppablePanel); 
    this.add(mainDragPanel); 
    this.add(mainDropPanel); 

    init(mainDropPanel, draggablePanel); 
} 

private void init(JPanel mainDropPanel, JPanel draggablePanel) { 
    DragSource ds = new DragSource(); 
    ds.createDefaultDragGestureRecognizer(draggablePanel, DnDConstants.ACTION_MOVE, new DragGestureListImp()); 

    new MyDropTargetListImp(mainDropPanel); 
} 

private class TransferablePanel implements Transferable { 

    private JPanel transferablePanel; 

    public TransferablePanel(JPanel transferablePanel) { 
     this.transferablePanel = transferablePanel; 
    } 

    @Override 
    public DataFlavor[] getTransferDataFlavors() { 
     return new DataFlavor[] { dataFlavor }; 
    } 

    @Override 
    public boolean isDataFlavorSupported(DataFlavor flavor) { 
     return flavor.equals(dataFlavor); 
    } 

    @Override 
    public Object getTransferData(DataFlavor flavor) 
     throws UnsupportedFlavorException, IOException { 

     if (flavor.equals(dataFlavor)){ 
      return transferablePanel; 
     } else { 
      throw new UnsupportedFlavorException(flavor); 
     } 
    } 
} 

private class DragGestureListImp implements DragGestureListener { 

    @Override 
    public void dragGestureRecognized(DragGestureEvent event) { 
     Cursor cursor = null; 
     JPanel panel = (JPanel) event.getComponent(); 

     if (event.getDragAction() == DnDConstants.ACTION_MOVE) { 
      cursor = DragSource.DefaultMoveDrop; 
     } 
     event.startDrag(cursor, new TransferablePanel(panel)); 
    } 
} 

private class MyDropTargetListImp extends DropTargetAdapter implements DropTargetListener { 

    private DropTarget dropTarget; 
    private JPanel panel; 

    public MyDropTargetListImp(JPanel panel) { 
     this.panel = panel; 
     dropTarget = new DropTarget(panel, DnDConstants.ACTION_MOVE, this, 
       true, null); 
    } 

    public void drop(DropTargetDropEvent event) { 
     try { 
      Transferable tr = event.getTransferable(); 
      JPanel an = (JPanel) tr.getTransferData(dataFlavor); 

      if (event.isDataFlavorSupported(dataFlavor)) { 
       event.acceptDrop(DnDConstants.ACTION_MOVE); 
       this.panel.add(an); 
       event.dropComplete(true); 
       this.panel.validate(); 
       this.panel.repaint(); 
       return; 
      } 
      event.rejectDrop(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      event.rejectDrop(); 
     } 
    } 
} 

public static void main(String[] args){ 
    System.out.println("Application Running"); 
    JPanel testDragAndDropPanel = new TestDragAndDropPanel(); 

    JFrame mainframe = new JFrame(); 
    mainframe.add(testDragAndDropPanel); 
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainframe.setSize(300,200); 
    mainframe.setVisible(true); 
} 
} 

기본적으로 드롭 사이드에서 아무 일도 일어나지 않는 것처럼 보입니다. 왜 누군가가 그 이유를 말해 줄 수 있습니까?

감사합니다.

답변

4

아무 것도 일어나지 않습니까? 패널을 떨어 뜨린 후 창을 최대화하면 변경 사항을 볼 수 있습니다. 문제는 드롭 패널을 다시 확인하지 않는다는 것입니다. 당신의 drop 방법에서

,이 부분이

if (event.isDataFlavorSupported(dataFlavor)) { 
    event.acceptDrop(DnDConstants.ACTION_MOVE); 
    panel.add(an); 
    panel.revalidate(); 
    event.dropComplete(true); 
    return; 
} 
+0

아와

if (event.isDataFlavorSupported(dataFlavor)) { event.acceptDrop(DnDConstants.ACTION_MOVE); this.panel.add(an); event.dropComplete(true); this.panel.validate(); this.panel.repaint(); return; } 

교체 한 좋은 - 왜이 다음 작동하지 유효성을 검사 했습니까? 유효성 검사를 언제 사용합니까? – maloney

+0

Swing 앱에서는 대부분 'revalidate'를 사용해야합니다 (경우에 따라'repaint'가 뒤따를 수도 있습니다) – Rempelos