2012-03-16 19 views
2

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

2番目のエラー

enter image description here

第三エラー

enter image description here

その後、Drag and Dropについてお読みくださいチュートリアル、例here

+0

ありがとうございます。さて、私はすでにこれらの例(と他の多くの例)を見てきましたが、成功しなかった(最後に画像が落とされることはありませんでした)が、私はTransferhandler( "icon"今私はどこかにそれを保存するためにイメージドロップ中にアルゴリズムを実装するTransferhandlerの拡張でそれを作りたいと思います。 – MHDaouas

+0

いくつかのクラスをインポートする必要があります。 – MHDaouas

+0

これは、Netbeans IDEから取り込まれた、Javaのインポート後の結果です。Eclipseのsimilair – mKorbel

関連する問題