2012-02-28 66 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)