2012-03-16 2 views
2

jlabel의 아이콘에서 이미지를 드래그하여 두 번째 jlabel의 다른 아이콘에 놓으 려합니다. 문제는 드래그 앤 드롭 Transferhandler 메서드의 일부 구현이 호출되지 않는 것 같아서 첫 번째 jlabel의 아이콘에서 이미지를 검색 할 수 없다는 것입니다. 당신이 내 코드에서 문제를 찾을 수 있기를 바랍니다.아이콘의 이미지를 JLabel에서 다른 이미지로 전송할 수 없습니다.

class dndHandler extends TransferHandler implements Transferable { 

    private final DataFlavor flavors[] = { DataFlavor.imageFlavor }; 

    private Image image; 

     @Override 
     public int getSourceActions(JComponent c) { 
      System.out.println("test"); // Does not work 
      return TransferHandler.COPY; 
     } 

     @Override 
     public Transferable createTransferable(JComponent comp) { 
      System.out.println("test"); // Does not work 
      image = null; 
      image = (Image)((ImageIcon) (((JLabel)comp).getIcon())).getImage(); //We transfer image //image stays null 
      return this; 
     } 

     @Override 
     public boolean canImport(JComponent comp, DataFlavor flavor[]) { 
      if (!(comp instanceof JLabel)) { 
       return false; 
      } 
      System.out.println("test"); //It works here 
      return true; 
     } 

     @Override 
     public boolean importData(JComponent comp, Transferable t) { 
      if (comp instanceof JLabel) { 

        System.out.println(((JLabel)comp).getName()); //It works but the image is null 
        ((JLabel)comp).setIcon(new ImageIcon(image)); //The label stays empty 
        return true; 
      } 
      return false; 
     } 

     @Override 
     public Object getTransferData(DataFlavor flavor) { 
      if (isDataFlavorSupported(flavor)) { 
       return image; 
      } 
      return null; 
     } 

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

     @Override 
     public boolean isDataFlavorSupported(DataFlavor flavor) { 
      return flavors[0].equals(flavor); 
     } 

    } 

    MouseListener specialListener = new SpecialDragMouseAdapter(); 

    class SpecialDragMouseAdapter extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent evt) { 
      JComponent comp = (JComponent)evt.getSource(); 
      TransferHandler th = comp.getTransferHandler(); 

      // Start the drag operation 
      th.exportAsDrag(comp, evt, TransferHandler.COPY); 
     } 

    } 

public class PrincipalFrame extends javax.swing.JFrame { 

    TransferHandler dropHandler = new dndHandler(); 

    public PrincipalFrame() 
    { 
     JLabel label1 = new JLabel(); 
     JLabel label2 = new JLabel(); 

     label1.setName("label "+i+"-"+j); 
     label1.setSize(50,50); 
     label1.setBorder(BorderFactory.createLineBorder(java.awt.Color.black)); 
     label1.setIcon(new ImageIcon("put a file path on your computer")) 
     label1.addMouseListener(specialListener); 
     label1.setTransferHandler(dropHandler); 

     label2.setName("label "+i+"-"+j); 
     label2.setSize(50,50); 
     label2.setBorder(BorderFactory.createLineBorder(java.awt.Color.black)); 
     label2.addMouseListener(specialListener); 
     label2.setTransferHandler(dropHandler); 
    } 
} 

public static void main(String args[]) { 

    /* 
    * Create and display the form 
    */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      javax.swing.JFrame principalFrame = new PrincipalFrame(); 
      //Size of the window 
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
      principalFrame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, 
            Toolkit.getDefaultToolkit().getScreenSize().height-40); 
      //Center the window 
      principalFrame.setLocation(0,0); 
      principalFrame.setVisible(true); 
     } 
    }); 
} 
+1

나는이 내 지식에 무언가를 추가 할이 대답 사람을 기다리고, 그러나 당신이 게시 한 코드의 종류 나에게 좋은 SSCCE을 표시하지 않습니다 . 좋은 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+1

@GagandeepBali '좋은 SSCCE, 나쁜 SSCCE 및 SSCCE가 아닙니다'가 있습니다. 이 코드는 마지막 카테고리에 적합합니다. OP에게. SSCCE를 만들려면, 1) JRE 2) 핫 링크 또는 3) 런타임에 생성 된 일부 이미지를 소싱하는 것 등 다양한 작업을 수행해야합니다. –

+0

이제 그 권리. 미안 해요. – MHDaouas

답변

1

나는 단지 자원 봉사를 해요 미안 해요,

하나의 오류

enter image description here

초 오류

enter image description here

세 번째 오류

enter image description here

.

다음 Drag and Drop에 대해 읽어 보시기 바랍니다 튜토리얼, 예를 here

+0

답변 해 주셔서 감사합니다. 글쎄, 이미이 예제 (그리고 많은 다른 것들)를 보았지만 성공하지 못했다. (결국 이미지가 삭제되지 않는다.) Transferhandler ("icon")를 직접 사용했을 때 나에게 도움이되었다. 이제는 Transferhandler를 확장하여 이미지를 놓는 동안 알고리즘을 구현하여 어딘가에 저장하려고합니다. – MHDaouas

+0

일부 클래스를 가져와야합니다. – MHDaouas

+0

이것은 Netbeans IDE에서 캡처 한 Java 가져 오기 이후의 결과입니다. – mKorbel

관련 문제