2012-07-12 17 views
6

के साथ एक JLabel खींच मैं एक TransferHandler उपयोग कर रहा हूँ एक JLabel के रूप एक JTextArea (खींचें करने के लिए JLabel बनाने के लिए बाएं पैनल में कहीं क्लिक करें)एक TransferHandler (खींचें और छोड़ें)

करने के लिए एक JPanel से डेटा पारित करने के लिए डेटा का स्थानांतरण ठीक काम करता है, लेकिन मैं जेएलएबल को "पॉइंटर" के साथ खींचने के रूप में भी "शो" करना चाहता हूं।

तुम बाहर टिप्पणी तो

dropLabel.setTransferHandler(new TransferHandler("text")); 

dropLabel.getTransferHandler().exportAsDrag(dropLabel, e, 
      TransferHandler.COPY); 

आप कैसे मैं इसे देखना चाहते हैं देखेंगे। (लेकिन निश्चित रूप से डेटा स्थानांतरित नहीं किया जाएगा)।

मैं माउस कर्सर का पालन करने के लिए काम और जेएलएबल दोनों को हस्तांतरण कैसे प्राप्त कर सकता हूं?

import java.awt.*; 
import java.awt.datatransfer.Transferable; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.border.Border; 

public class DragTest extends JFrame implements MouseMotionListener, 
     MouseListener { 

    private JPanel leftPanel = new JPanel(null); 
    private JPanel rightPanel = new JPanel(null); 
    private JLabel dragLabel = new JLabel("drop"); 
    private final JWindow window = new JWindow(); 
    JLabel dropLabel; 

    public DragTest() { 
     this.setLayout(new GridLayout(1, 2)); 

     leftPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     rightPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.add(leftPanel); 
     this.add(rightPanel); 
     leftPanel.addMouseListener(this); 
     leftPanel.addMouseMotionListener(this); 

     JTextArea area = new JTextArea(); 

     rightPanel.setLayout(new GridLayout(1, 1)); 
     rightPanel.add(area); 

     dragLabel.setFont(new Font("Serif", Font.BOLD, 48)); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 

     dropLabel = new JLabel("drop"); 

     Dimension labelSize = dropLabel.getPreferredSize(); 
     dropLabel.setSize(labelSize); 
     int x = e.getX() - labelSize.width/2; 
     int y = e.getY() - labelSize.height/2; 
     dropLabel.setLocation(x, y); 
     leftPanel.add(dropLabel); 

     dropLabel.setTransferHandler(new TransferHandler("text")); 

     dropLabel.getTransferHandler().exportAsDrag(dropLabel, e, 
       TransferHandler.COPY); 

     repaint(); 

    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     dragLabel = new JLabel("drop"); 
     dragLabel.setFont(new Font("Serif", Font.BOLD, 48)); 
     int x = me.getPoint().x; 
     int y = me.getPoint().y; 
     window.add(dragLabel); 
     window.pack(); 
     Point pt = new Point(x, y); 
     Component c = (Component) me.getSource(); 
     SwingUtilities.convertPointToScreen(pt, c); 
     window.setLocation(pt); 
     window.setVisible(true); 
     repaint(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

//  leftPanel.remove(dropLabel); 

     window.remove(dragLabel); 
     window.setVisible(false); 

     repaint(); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    public static void main(String[] args) { 

     DragTest frame = new DragTest(); 
     frame.setVisible(true); 
     frame.setSize(600, 400); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

उत्तर

9

एक और उदाहरण:

enter image description here

संपादित करें: एक निमिष कर्सर

import java.awt.*; 
import java.awt.datatransfer.*; 
import java.awt.dnd.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 
import javax.activation.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class DragTest3 { 
    public JComponent makeUI() { 
    DragPanel p1 = new DragPanel(); 
    p1.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    p1.add(new JLabel(UIManager.getIcon("OptionPane.warningIcon"))); 
    p1.add(new JLabel(UIManager.getIcon("OptionPane.errorIcon"))); 
    p1.add(new JLabel("Label1")); 
    p1.add(new JLabel("Label2")); 
    MouseListener handler = new Handler(); 
    p1.addMouseListener(handler); 
    LabelTransferHandler th = new LabelTransferHandler(); 
    p1.setTransferHandler(th); 
    JPanel p = new JPanel(new GridLayout(1,2)); 
    p.add(p1); 

    DragPanel p2 = new DragPanel(); 
    p2.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    p2.addMouseListener(handler); 
    p2.setTransferHandler(th); 
    p.add(p2); 

    JPanel panel = new JPanel(new GridLayout(2,1)); 
    panel.add(p); 
    panel.add(new JScrollPane(new JTextArea())); 
    return panel; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new DragTest3().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
class DragPanel extends JPanel { 
    public DragPanel() { 
    super(); 
    } 
    public JLabel draggingLabel; 
} 
class Handler extends MouseAdapter { 
    @Override public void mousePressed(MouseEvent e) { 
    DragPanel p = (DragPanel)e.getSource(); 
    Component c = SwingUtilities.getDeepestComponentAt(p, e.getX(), e.getY()); 
    if(c!=null && c instanceof JLabel) { 
     p.draggingLabel = (JLabel)c; 
     p.getTransferHandler().exportAsDrag(p, e, TransferHandler.MOVE); 
    } 
    } 
} 
class LabelTransferHandler extends TransferHandler { 
    private final DataFlavor localObjectFlavor; 
    private final JLabel label = new JLabel() { 
    @Override public boolean contains(int x, int y) { 
     return false; 
    } 
    }; 
    private final JWindow window = new JWindow(); 
    public LabelTransferHandler() { 
    System.out.println("LabelTransferHandler"); 
    localObjectFlavor = new ActivationDataFlavor(
     DragPanel.class, DataFlavor.javaJVMLocalObjectMimeType, "JLabel"); 
    window.add(label); 
    window.setAlwaysOnTop(true); 
    window.setBackground(new Color(0,true)); 
    DragSource.getDefaultDragSource().addDragSourceMotionListener(
    new DragSourceMotionListener() { 
     @Override public void dragMouseMoved(DragSourceDragEvent dsde) { 
     Point pt = dsde.getLocation(); 
     pt.translate(5, 5); // offset 
     window.setLocation(pt); 
     } 
    }); 
    } 
    @Override protected Transferable createTransferable(JComponent c) { 
    System.out.println("createTransferable"); 
    DragPanel p = (DragPanel)c; 
    JLabel l = p.draggingLabel; 
    String text = l.getText(); 
    //TEST 
    //if(text==null) { 
    // text = l.getIcon().toString(); 
    //} 
    //return new StringSelection(text+"\n"); 
    final DataHandler dh = new DataHandler(c, localObjectFlavor.getMimeType()); 
    if(text==null) return dh; 
    final StringSelection ss = new StringSelection(text+"\n"); 
    return new Transferable() { 
     @Override public DataFlavor[] getTransferDataFlavors() { 
     ArrayList<DataFlavor> list = new ArrayList<>(); 
     for(DataFlavor f:ss.getTransferDataFlavors()) { 
      list.add(f); 
     } 
     for(DataFlavor f:dh.getTransferDataFlavors()) { 
      list.add(f); 
     } 
     return list.toArray(dh.getTransferDataFlavors()); 
     } 
     public boolean isDataFlavorSupported(DataFlavor flavor) { 
     for (DataFlavor f: getTransferDataFlavors()) { 
      if (flavor.equals(f)) { 
      return true; 
      } 
     } 
     return false; 
     } 
     public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
     if(flavor.equals(localObjectFlavor)) { 
      return dh.getTransferData(flavor); 
     } else { 
      return ss.getTransferData(flavor); 
     } 
     } 
    }; 
    } 
    @Override public boolean canImport(TransferSupport support) { 
    if(!support.isDrop()) { 
     return false; 
    } 
    return true; 
    } 
    @Override public int getSourceActions(JComponent c) { 
    System.out.println("getSourceActions"); 
    DragPanel p = (DragPanel)c; 
    label.setIcon(p.draggingLabel.getIcon()); 
    label.setText(p.draggingLabel.getText()); 
    window.pack(); 
    Point pt = p.draggingLabel.getLocation(); 
    SwingUtilities.convertPointToScreen(pt, p); 
    window.setLocation(pt); 
    window.setVisible(true); 
    return MOVE; 
    } 
    @Override public boolean importData(TransferSupport support) { 
    System.out.println("importData"); 
    if(!canImport(support)) return false; 
    DragPanel target = (DragPanel)support.getComponent(); 
    try { 
     DragPanel src = (DragPanel)support.getTransferable().getTransferData(localObjectFlavor); 
     JLabel l = new JLabel(); 
     l.setIcon(src.draggingLabel.getIcon()); 
     l.setText(src.draggingLabel.getText()); 
     target.add(l); 
     target.revalidate(); 
     return true; 
    } catch(UnsupportedFlavorException ufe) { 
     ufe.printStackTrace(); 
    } catch(java.io.IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    return false; 
    } 
    @Override protected void exportDone(JComponent c, Transferable data, int action) { 
    System.out.println("exportDone"); 
    DragPanel src = (DragPanel)c; 
    if(action == TransferHandler.MOVE) { 
     src.remove(src.draggingLabel); 
     src.revalidate(); 
     src.repaint(); 
    } 
    src.draggingLabel = null; 
    window.setVisible(false); 
    } 
} 
+0

यह धोखाधड़ी है;) – MadProgrammer

+0

@ मैडप्रोग्रामर मुझे ऐसा लगता है :) – aterai

+0

आह हाँ, लेकिन यह एक अच्छा धोखा है;) – MadProgrammer

3

अद्यतन: दुर्भाग्य से, आप एक TransferHandler का उपयोग कर रहे

यहाँ कोड है।

पिछली बार जब मैंने TransferHandler एपीआई (लगभग 6.10/6.12 के आसपास) के साथ खेला था तो कोड में एक बग था जो स्थानांतरण छवि को अनदेखा करता था। यह वास्तव में इसे शून्य करने के लिए सेट। यह बाद के अपडेट में तय किया गया हो सकता है, लेकिन मैंने हाल ही में चेक नहीं किया है।

खुदाई के बाद, मैंने पाया है कि ट्रांसफरहैंडलर का डिफ़ॉल्ट कार्यान्वयन "getVisualReresentation (Transferable t)" विधि को अनदेखा करता है। महान नहीं है।

मैंने कुछ खुदाई की और कक्षा डीएनडी प्रक्रिया के कामकाज को संभालने के लिए "निजी" आंतरिक कक्षाओं के समूह का उपयोग करती है, जिससे इसे पूरी चीज को फिर से लिखने के बिना कार्यान्वयन को बदलने के लिए असंभव के करीब बना दिया जाता है।

असल में, DragSource आपको उस छवि में गुजरने की अनुमति देता है जिसका उपयोग यह कर सकता है (जैसा कि यह काम एक और सवाल है), लेकिन यह एक निजी DragHandler कक्षा के अंदर छिपा हुआ है। धन्यवाद सूर्य

+0

और था एक एक हस्तांतरण हैंडलर को फिर से लिखने की कोशिश कर रहा है, लेकिन वहाँ इतना पैकेज निजी कोड सिर्फ एक सरल कार्य – MadProgrammer

+0

कोशिश करने के लिए मैं एक "मैन्युअल" DnD प्रक्रिया की कोशिश की और "startDrag" विधि नहीं है नहीं है कि देखो विंडोज 7 के तहत आपूर्ति की गई ड्रैग छवि का उपयोग करें (मुझे लगता है कि मैक यह कर सकता है) ... आप http://rabbit-hole.blogspot.com.au/2006/05/my-drag-image- अधिक जानकारी के लिए your.html से बेहतर है – MadProgrammer

-2

मैं इस कोड का इस्तेमाल किया और कुछ सुधार किए हैं ठीक करें। मैं इसे एसओएस के अनुसार एसओ को दोबारा पोस्ट कर रहा हूं।

import java.awt.Color; 
import java.awt.Point; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.StringSelection; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.dnd.DragSource; 
import java.awt.dnd.DragSourceDragEvent; 
import java.awt.dnd.DragSourceMotionListener; 
import java.io.IOException; 
import java.util.ArrayList; 
import javax.activation.ActivationDataFlavor; 
import javax.activation.DataHandler; 
import javax.swing.*; 


@SuppressWarnings("serial") 
public class LabelTransferHandler extends TransferHandler { 

    private final DataFlavor localObjectFlavor; 
    private final DeviceAssignments root; 

    private final JLabel label = new JLabel() { 
     @Override public boolean contains(int x, int y) { 
      return false; 
     } 
    }; 

    private final JWindow window = new JWindow(); 

    public LabelTransferHandler(DeviceAssignments root) { 
     this.root = root; 
     localObjectFlavor = new ActivationDataFlavor(
      LabelDragScrollPane.class, DataFlavor.javaJVMLocalObjectMimeType, "JLabel"); 
     window.add(label); 
     window.setAlwaysOnTop(true); 
     window.setBackground(new Color(0,true)); 
     DragSource.getDefaultDragSource().addDragSourceMotionListener(
      new DragSourceMotionListener() { 
       @Override public void dragMouseMoved(DragSourceDragEvent dsde) { 
        Point pt = dsde.getLocation(); 
        pt.translate(5, 5); // offset 
        window.setLocation(pt); 
       } 
      } 
     ); 
    } 

    @Override protected Transferable createTransferable(JComponent c) { 
     LabelDragScrollPane p = (LabelDragScrollPane)c; 
     MacLabel l = p.draggingLabel; 
     String text = l.getMac(); 
     final DataHandler dh = new DataHandler(c, localObjectFlavor.getMimeType()); 
     if(text==null) return dh; 
     final StringSelection ss = new StringSelection(text+"\n"); 
     return new Transferable() { 
      @Override public DataFlavor[] getTransferDataFlavors() { 
      ArrayList<DataFlavor> list = new ArrayList<DataFlavor>(); 
      for(DataFlavor f:ss.getTransferDataFlavors()) { 
       list.add(f); 
      } 
      for(DataFlavor f:dh.getTransferDataFlavors()) { 
       list.add(f); 
      } 
      return list.toArray(dh.getTransferDataFlavors()); 
      } 
      public boolean isDataFlavorSupported(DataFlavor flavor) { 
       for (DataFlavor f: getTransferDataFlavors()) { 
        if (flavor.equals(f)) { 
         return true; 
        } 
       } 
       return false; 
      } 
      public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
       if(flavor.equals(localObjectFlavor)) { 
        return dh.getTransferData(flavor); 
       } else { 
        return ss.getTransferData(flavor); 
       } 
      } 
     }; 
    } 

    @Override public boolean canImport(TransferSupport support) { 
     if(!support.isDrop()) { 
      return false; 
     } 
     return true; 
    } 

    @Override public int getSourceActions(JComponent c) { 
     LabelDragScrollPane p = (LabelDragScrollPane)c; 
     label.setBorder(p.draggingLabel.getBorder()); 
     label.setText(p.draggingLabel.getMac()); 
     label.setPreferredSize(p.draggingLabel.getPreferredSize()); 

     window.pack(); 
     Point pt = p.draggingLabel.getLocation(); 
     SwingUtilities.convertPointToScreen(pt, p); 
     window.setLocation(pt); 
     window.setVisible(true); 
     return MOVE; 
    } 

    @Override public boolean importData(TransferSupport support) { 
     if(!canImport(support)) return false; 
     JButton target = (JButton)support.getComponent(); 
     try { 
      LabelDragScrollPane src = (LabelDragScrollPane)support.getTransferable().getTransferData(localObjectFlavor); 
      target.setText(src.draggingLabel.getMac()); 
      return true; 
     } catch(UnsupportedFlavorException ufe) { 
      ufe.printStackTrace(); 
     } catch(java.io.IOException ioe) { 
      ioe.printStackTrace(); 
     } 
     return false; 
    } 
    @Override protected void exportDone(JComponent c, Transferable data, int action) { 
     LabelDragScrollPane src = (LabelDragScrollPane)c; 
     if(action == TransferHandler.MOVE) { 
      root.updateNodeIdPanel(); 
     } 
     src.draggingLabel = null; 
     window.setVisible(false); 
    } 
} 
+0

यह प्रश्न का एक नया उत्तर प्रतीत नहीं होता है और संभवतः हटा दिया जाएगा। यदि आप कोड का पुन: उपयोग कर रहे हैं और सीसी लाइसेंसिंग के बारे में चिंतित हैं तो आपको या तो मूल लाइसेंसिंग के बारे में मूल लेखक से पूछना होगा या एट्रिब्यूशन को कहीं भी लिखना होगा, जहां आप इसका उपयोग कर रहे हैं, यहां नहीं। –

+0

जो भी आप चाहते हैं उसे करें।मैंने वेबसाइट के लिए उपयोग की शर्तों का पालन किया। मेरा विवेक साफ है। –

संबंधित मुद्दे