2012-05-08 2 views
4

저는 Swing에서 드래그 앤 드롭하기가 새로 도입되었습니다. 캡션을 겹쳐서 이미지를 그리는 JPanel이 있습니다. 이 JPanel에 드래그 앤 드롭을 구현하고 싶지만, 일부 문서 및 자습서를 거친 후에이 유형의 구성 요소에 대한 수행 방법에 대한 유용한 포인터를 찾지 못했습니다. 처음에는 setDragEnabled 기능이 없습니다.하나의 JPanel에서 다른 JPanel로 드래그 앤 드롭을 구현합니다.

JPanel을 드래그 할 수 있습니까? 이 DnD 조작을 사용하여 한 패널에서 다른 패널로 특정 객체에 대한 참조를 전달하고 싶습니다.

+2

* "나는 JPanel을 드래그 가능하게 만들 수 있는가?"*'JList'에 추가된다면 그 드래그 가능하다. –

+4

http://www.bryanesmith.com/documents/drag-and-drop-panel-demo/index.html? – StanislavL

+0

좋은 링크 @StanislavL – Robin

답변

3

이것이 당신을 도울 수있다.

Drag and Drop of complex custom objects in Java

+0

코드 샘플을 통해 해결책을 찾을 수있었습니다. 고맙습니다 ... 현상금은 당신 것입니다! – Pieter

+0

나는 그것을 알고있어 기쁘다! 천만에요! –

3

JComponent에서 끌어서 놓기 동작을 구현할 수 있습니다. setTransferHandler 방법을 참조하십시오.

setDragEnabled 메서드는 일반적으로 좋은 기본 D & D 동작을 JDK에서 구현할 수있는 구성 요소에 제공됩니다. 이 경우 해당 메소드를 호출하여 기본값 D & D를 활성화 할 수 있습니다. 당신이 TransferHandler 자신을 구현해야합니다 있도록 JPanel 그들 (= 스윙 개발자)에

아마, 어떤 점잖은 기본 D & D의 행동을 생각하지 못했습니다. 나는 강력하게 시작하기 전에 Drag-and-drop tutorial을 읽을 것을 제안한다.

+0

나는 물건을 떨어 뜨리는 데 문제가있다. 다음은 관련 코드 스 니펫입니다 (http : // pastebin).com/2UdnxSBH * [DRAG] 생성 Transferable [email protected]* * [DROP] Detected drop [email protected]*. 'Transferable'은'DataHandler'의 인스턴스가 아닙니다. 예상했던 것입니다. – Pieter

+0

아마도 JPanel을 다른 JPanel로 드래그하려고한다는 것을 분명히해야합니다. [최상위 수준 드롭] (http://docs.oracle.com/javase/tutorial/uiswing/dnd/toplevel.html) 자습서에서는 파일을 응용 프로그램으로 드래그하는 방법에 대해서만 다룹니다. – Pieter

1

내가 어떻게 가능한 소리를 모르지만 드래그 앤 드롭 패널을하기 위해 필요로 할 때 나는 이런 식으로했다 : 나는 dragable 패널과 용기 액션 이벤트를 구현

Firstable를, 그것은 할 수있다 모두

나는 마우스가 패널 위에있을 때

당신이 현재 패널로 설정 선택한 부모, 선택 아동과 현재 패널에 대한 정적 변수를 사용

당신이 클릭 할 때, currentpanel는 하나를 클릭하고 설정되어있는 경우, 당신은 확인 어떤 아래로 마우스 '마우스가 패널과 자식 패널 위에있을 때

가 null가 아닌, 그것은 당신 보인다 자식 패널과 같다 마우스를 놓으면 현재 패널이 부모 패널로 바뀝니다.

일부 유효성 검사를 추가해야합니다.

패널은 당신이 당신의 자신의 구현을 사용할 수 있습니다 드래그되는 경우, 마우스 좌표를 따르거나 그냥 강조하고 부모를 강조 할 수있는, 내가 드래그를


확인을 시뮬레이션이 마지막 옵션을 사용 나는 이것을 작성 했으므로 버그가있다. 그러나 이것은 생각이다 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

/** 
* 
* @author porfiriopartida 
*/ 
public class DraggablePanel extends JDesktopPane implements ContainerPanel{ 
    public ContainerPanel parent; 

    static DraggablePanel over; 
    static ContainerPanel overParent; 
    static DraggablePanel dragging; 
    static ContainerPanel draggingParent; 

    public DraggablePanel(){ 
     this(null); 
    } 
    public DraggablePanel(ContainerPanel parent){ 
     this.parent = parent; 
     setBorder(BorderFactory.createLineBorder(Color.black)); 
     setBounds(0,0,100,100); 

     if(parent != null) 
      addMouseListener(new MouseAdapter(){ 
      @Override 
      public void mouseEntered(MouseEvent me) { 
       DraggablePanel src = (DraggablePanel) me.getSource(); 
       DraggablePanel.over = src; 
       DraggablePanel.overParent = DraggablePanel.over.parent; 
      } 

      @Override 
      public void mouseExited(MouseEvent me) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent me) { 
       if(DraggablePanel.over != null && DraggablePanel.dragging != null && DraggablePanel.overParent != null){ 
        Rectangle bounds = DraggablePanel.dragging.getBounds(); 
        bounds.x = me.getX(); 
        bounds.y = me.getY(); 

        //Remove child from parent 
        DraggablePanel.dragging.parent.removePanel(DraggablePanel.dragging); 

        if(DraggablePanel.dragging.parent != DraggablePanel.overParent){ 
         //add child to new parent 
         DraggablePanel.overParent.addPanel(DraggablePanel.dragging, bounds); 
        } 
        else{ 
         //same parent selected 
         DraggablePanel.dragging.parent.addPanel(DraggablePanel.dragging, bounds); 
        }; 
        DraggablePanel.dragging.parent = DraggablePanel.overParent; 
       } 

       //cleaning variables 
       DraggablePanel.dragging = null; 
       DraggablePanel.over = null; 
       DraggablePanel.draggingParent = null; 
       DraggablePanel.overParent = null; 

      } 

      @Override 
      public void mousePressed(MouseEvent me) { 
       DraggablePanel.dragging = (DraggablePanel) me.getSource(); 
       DraggablePanel.draggingParent = DraggablePanel.dragging.parent; 
      } 
     }); 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseEntered(MouseEvent me) { 
       super.mouseEntered(me); 
       ContainerPanel src = (ContainerPanel) me.getSource(); 
       DraggablePanel.overParent = src; 
       if (DraggablePanel.draggingParent == null || DraggablePanel.draggingParent == src) { 
        setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 
       } else { 
        setBorder(BorderFactory.createLineBorder(Color.blue, 2)); 
       } 
      } 

      @Override 
      public void mouseExited(MouseEvent me) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent me) { 
      } 
     }); 
    } 

    @Override 
    public void addPanel(DraggablePanel panel) { 
     panel.parent = this; 
     add(panel); 

      repaint(); 
      revalidate(); 

      try { 
      getParent().repaint(); 
     } catch (Exception e) { 
     } 

    } 
    @Override 
    public void addPanel(DraggablePanel panel, Rectangle bounds) { 
     setBounds(bounds); 
     addPanel(panel); 
    } 

    @Override 
    public void removePanel(DraggablePanel panel) { 
     remove(panel); 
    } 



    public static void main(String args[]){ 
     JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(1,1)); 
     JTextField tf = new JTextField("textfield"); 
     JButton btn = new JButton("Button"); 

     DraggablePanel desktop = new DraggablePanel(); 
     frame.add(desktop); 

     DraggablePanel p1 = new DraggablePanel(desktop); 
     p1.setLayout(new GridLayout(2,1)); 
     p1.add(tf); 
     p1.setBounds(0,0,100,50); 
     tf.setBounds(5,5,80,30); 

     DraggablePanel p2 = new DraggablePanel(desktop); 
     p2.setLayout(new GridLayout(2,1)); 
     p2.add(btn); 
     p2.setBounds(50,50,50,30); 
     btn.setBounds(5,5,30,20); 

     desktop.add(p1); 
     desktop.add(p2); 

     frame.setPreferredSize(new Dimension(600,400)); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
관련 문제