2012-10-11 107 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); 
    this.panel.add(an); 
    event.dropComplete(true); 
    this.panel.validate(); 
    this.panel.repaint(); 
    return; 
} 

與此

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

啊,好一個 - 爲什麼沒有驗證這個工作呢?你什麼時候會使用驗證? – maloney

+0

在Swing應用程序中,大部分時間應該使用'revalidate'(有時可能會緊跟'repaint',取決於大小寫,您應該試驗一下) – Rempelos