2012-02-28 69 views
2

我已經在兩個JPanel之間實現了這個非常基本的拖放功能,但這並不能真正滿足我的要求!Java。將ImageIcon從面板1上的JLabel拖放到面板2上的JLabel。添加計數器功能

public class test extends JFrame { 

{ JPanel mainpanel, storypanel, imageselect; 



    public test(){ 

      mainpanel = new JPanel(new BorderLayout()); 
      storypanel = new JPanel(); 
      imageselect = new JPanel(); 
      MouseListener listener = new MouseAdapter(){ 
      public void mousePressed(MouseEvent e) 
     { 
      JComponent c = (JComponent) e.getSource(); 
      TransferHandler handler = c.getTransferHandler(); 
      handler.exportAsDrag(c, e, TransferHandler.COPY); 
     } 
     }; 

      int j = 0; 
      BufferedImage myImages; 
      JLabel imgselect = new JLabel(); 
      try { myImages = ImageIO.read(new File("four.jpg")); 
      //myImages[j] = resize(myImages[j]); 
      imgselect= new JLabel(new ImageIcon(myImages)); 
      System.out.println(j); 
      imageselect.add(imgselect); 
      imgselect.addMouseListener(listener); 
      imgselect.setTransferHandler(new TransferHandler("icon")); 

      } catch(Exception e) {}; 

      int i = 0; 
      BufferedImage storyimages; 
      JLabel storylabel = new JLabel(); 


      //targetImg = new ImageIcon("lmkpackage/base/TargetImg.jpg"); 
      try{ storyimages = ImageIO.read(new File("TargetImg.jpg")); 
      //storyimages[i] = resize(storyimages[i]); 
      storylabel = new JLabel(new ImageIcon(storyimages)); 
      System.out.println(i); 
      storypanel.add(storylabel); 
      storylabel.addMouseListener(listener); 
      storylabel.setTransferHandler(new TransferHandler("icon")); 
      } catch(Exception e) {}; 


      mainpanel.add(imageselect, BorderLayout.NORTH); 
      mainpanel.add(storypanel, BorderLayout.SOUTH); 

      getContentPane().add(mainpanel); 



     } 

     public static void main(String[] args){ 

     System.out.println("Application Running"); 
     JFrame mainframe = new test(); 
      mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainframe.setSize(1000,1000); 
      mainframe.setVisible(true); 

     } 

    } 

對不起,我在這裏不是很清楚。我試圖將ImageIcon從imageselect面板上的JLabel拖動到另一個JLabel故事情節面板。我可以用上面的代碼來做到這一點。 但是,當我這樣做時,我可以從imageselect面板中拖出ImageIcon,並在同一面板上替換另一個ImageIcon。我不希望發生這種情況。我也可以從故事情節面板拖到imageselect面板,我不想。

我不是要求勺子餵食代碼,我只是尋找一個正確的方向推!

編輯:我想知道有沒有計算成功拖放操作的任何方法,下面的解決方案回答了我的原始問題。

+0

請其中的教程之一,免打擾在Swing也許night_mare,但用的JLabel圖像不以某種方式c​​ompliced和工程 – mKorbel 2012-02-28 17:21:31

+3

拒絕了「從」面板上的下降?爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-02-28 20:02:26

+0

@AndrewThompson我已更新我的問題,更詳細 – Peddler 2012-02-28 22:25:47

回答

5

這是基本的@安德魯的評論大綱 - 易可能的,因爲你的SSCCE :-)

子類的TransferHandler,覆蓋canImport檢查源標籤是imageSelect面板上,並拒絕如果是這樣。

// custom transferHandler which decides about imports based on source 
    TransferHandler handler = new TransferHandler("icon") { 

     @Override 
     public boolean canImport(TransferSupport support) { 
      return super.canImport(support) 
        && support.getComponent().getParent() != imageSelectPanel; 
     } 

    }; 
    // use the handler on all labels (handlers can be shared, btw) 
    // for each label on imageSelectPanel 
    imageSelectLabel.setTransferHandler(handler) 
    // for each label on the target panel (aka storyPanel) 
    storyLabel.setTransferHandler(handler)