java – 使用TransferHandler拖动JLabel(拖放)

前端之家收集整理的这篇文章主要介绍了java – 使用TransferHandler拖动JLabel(拖放)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用TransferHandler将数据从JPanel传递到JTextArea作为JLabel(单击左侧面板中的某个位置以创建要拖动的JLabel)

数据的传输工作正常,但我也想“显示”JLabel被拖动与鼠标指针一起.

如果你评论出来

  1. dropLabel.setTransferHandler(new TransferHandler("text"));
  2.  
  3. dropLabel.getTransferHandler().exportAsDrag(dropLabel,e,TransferHandler.COPY);

你会看到我希望它看起来如何. (但当然数据不会被转移).

如何让传输工作和JLabel跟随鼠标光标?

这是代码

  1. import java.awt.*;
  2. import java.awt.datatransfer.Transferable;
  3. import java.awt.event.*;
  4.  
  5. import javax.swing.*;
  6. import javax.swing.border.Border;
  7.  
  8. public class DragTest extends JFrame implements MouseMotionListener,MouseListener {
  9.  
  10. private JPanel leftPanel = new JPanel(null);
  11. private JPanel rightPanel = new JPanel(null);
  12. private JLabel dragLabel = new JLabel("drop");
  13. private final JWindow window = new JWindow();
  14. JLabel dropLabel;
  15.  
  16. public DragTest() {
  17. this.setLayout(new GridLayout(1,2));
  18.  
  19. leftPanel.setBorder(BorderFactory.createLineBorder(Color.black));
  20. rightPanel.setBorder(BorderFactory.createLineBorder(Color.black));
  21. this.add(leftPanel);
  22. this.add(rightPanel);
  23. leftPanel.addMouseListener(this);
  24. leftPanel.addMouseMotionListener(this);
  25.  
  26. JTextArea area = new JTextArea();
  27.  
  28. rightPanel.setLayout(new GridLayout(1,1));
  29. rightPanel.add(area);
  30.  
  31. dragLabel.setFont(new Font("Serif",Font.BOLD,48));
  32. }
  33.  
  34. @Override
  35. public void mousePressed(MouseEvent e) {
  36.  
  37. dropLabel = new JLabel("drop");
  38.  
  39. Dimension labelSize = dropLabel.getPreferredSize();
  40. dropLabel.setSize(labelSize);
  41. int x = e.getX() - labelSize.width / 2;
  42. int y = e.getY() - labelSize.height / 2;
  43. dropLabel.setLocation(x,y);
  44. leftPanel.add(dropLabel);
  45.  
  46. dropLabel.setTransferHandler(new TransferHandler("text"));
  47.  
  48. dropLabel.getTransferHandler().exportAsDrag(dropLabel,TransferHandler.COPY);
  49.  
  50. repaint();
  51.  
  52. }
  53.  
  54. @Override
  55. public void mouseDragged(MouseEvent me) {
  56. dragLabel = new JLabel("drop");
  57. dragLabel.setFont(new Font("Serif",48));
  58. int x = me.getPoint().x;
  59. int y = me.getPoint().y;
  60. window.add(dragLabel);
  61. window.pack();
  62. Point pt = new Point(x,y);
  63. Component c = (Component) me.getSource();
  64. SwingUtilities.convertPointToScreen(pt,c);
  65. window.setLocation(pt);
  66. window.setVisible(true);
  67. repaint();
  68. }
  69.  
  70. @Override
  71. public void mouseMoved(MouseEvent e) {
  72. }
  73.  
  74. @Override
  75. public void mouseClicked(MouseEvent e) {
  76.  
  77. }
  78.  
  79. @Override
  80. public void mouseReleased(MouseEvent e) {
  81.  
  82. // leftPanel.remove(dropLabel);
  83.  
  84. window.remove(dragLabel);
  85. window.setVisible(false);
  86.  
  87. repaint();
  88. }
  89.  
  90. @Override
  91. public void mouseEntered(MouseEvent e) {
  92.  
  93. }
  94.  
  95. @Override
  96. public void mouseExited(MouseEvent e) {
  97.  
  98. }
  99.  
  100. public static void main(String[] args) {
  101.  
  102. DragTest frame = new DragTest();
  103. frame.setVisible(true);
  104. frame.setSize(600,400);
  105. frame.setResizable(false);
  106. frame.setLocationRelativeTo(null);
  107. frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
  108. }
  109. }

解决方法

另一个例子:

编辑:修复闪烁的光标

  1. import java.awt.*;
  2. import java.awt.datatransfer.*;
  3. import java.awt.dnd.*;
  4. import java.awt.event.*;
  5. import java.io.*;
  6. import java.util.*;
  7. import javax.activation.*;
  8. import javax.swing.*;
  9. import javax.swing.text.*;
  10.  
  11. public class DragTest3 {
  12. public JComponent makeUI() {
  13. DragPanel p1 = new DragPanel();
  14. p1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
  15. p1.add(new JLabel(UIManager.getIcon("OptionPane.warningIcon")));
  16. p1.add(new JLabel(UIManager.getIcon("OptionPane.errorIcon")));
  17. p1.add(new JLabel("Label1"));
  18. p1.add(new JLabel("Label2"));
  19. MouseListener handler = new Handler();
  20. p1.addMouseListener(handler);
  21. LabelTransferHandler th = new LabelTransferHandler();
  22. p1.setTransferHandler(th);
  23. JPanel p = new JPanel(new GridLayout(1,2));
  24. p.add(p1);
  25.  
  26. DragPanel p2 = new DragPanel();
  27. p2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
  28. p2.addMouseListener(handler);
  29. p2.setTransferHandler(th);
  30. p.add(p2);
  31.  
  32. JPanel panel = new JPanel(new GridLayout(2,1));
  33. panel.add(p);
  34. panel.add(new JScrollPane(new JTextArea()));
  35. return panel;
  36. }
  37. public static void main(String[] args) {
  38. EventQueue.invokeLater(new Runnable() {
  39. @Override public void run() {
  40. createAndShowGUI();
  41. }
  42. });
  43. }
  44. public static void createAndShowGUI() {
  45. JFrame f = new JFrame();
  46. f.setDefaultCloSEOperation(WindowConstants.EXIT_ON_CLOSE);
  47. f.getContentPane().add(new DragTest3().makeUI());
  48. f.setSize(320,240);
  49. f.setLocationRelativeTo(null);
  50. f.setVisible(true);
  51. }
  52. }
  53. class DragPanel extends JPanel {
  54. public DragPanel() {
  55. super();
  56. }
  57. public JLabel draggingLabel;
  58. }
  59. class Handler extends MouseAdapter {
  60. @Override public void mousePressed(MouseEvent e) {
  61. DragPanel p = (DragPanel)e.getSource();
  62. Component c = SwingUtilities.getDeepestComponentAt(p,e.getX(),e.getY());
  63. if(c!=null && c instanceof JLabel) {
  64. p.draggingLabel = (JLabel)c;
  65. p.getTransferHandler().exportAsDrag(p,TransferHandler.MOVE);
  66. }
  67. }
  68. }
  69. class LabelTransferHandler extends TransferHandler {
  70. private final DataFlavor localObjectFlavor;
  71. private final JLabel label = new JLabel() {
  72. @Override public boolean contains(int x,int y) {
  73. return false;
  74. }
  75. };
  76. private final JWindow window = new JWindow();
  77. public LabelTransferHandler() {
  78. System.out.println("LabelTransferHandler");
  79. localObjectFlavor = new ActivationDataFlavor(
  80. DragPanel.class,DataFlavor.javaJVMLocalObjectMimeType,"JLabel");
  81. window.add(label);
  82. window.setAlwaysOnTop(true);
  83. window.setBackground(new Color(0,true));
  84. DragSource.getDefaultDragSource().addDragSourceMotionListener(
  85. new DragSourceMotionListener() {
  86. @Override public void dragMouseMoved(DragSourceDragEvent dsde) {
  87. Point pt = dsde.getLocation();
  88. pt.translate(5,5); // offset
  89. window.setLocation(pt);
  90. }
  91. });
  92. }
  93. @Override protected Transferable createTransferable(JComponent c) {
  94. System.out.println("createTransferable");
  95. DragPanel p = (DragPanel)c;
  96. JLabel l = p.draggingLabel;
  97. String text = l.getText();
  98. //TEST
  99. //if(text==null) {
  100. // text = l.getIcon().toString();
  101. //}
  102. //return new StringSelection(text+"\n");
  103. final DataHandler dh = new DataHandler(c,localObjectFlavor.getMimeType());
  104. if(text==null) return dh;
  105. final StringSelection ss = new StringSelection(text+"\n");
  106. return new Transferable() {
  107. @Override public DataFlavor[] getTransferDataFlavors() {
  108. ArrayList<DataFlavor> list = new ArrayList<>();
  109. for(DataFlavor f:ss.getTransferDataFlavors()) {
  110. list.add(f);
  111. }
  112. for(DataFlavor f:dh.getTransferDataFlavors()) {
  113. list.add(f);
  114. }
  115. return list.toArray(dh.getTransferDataFlavors());
  116. }
  117. public boolean isDataFlavorSupported(DataFlavor flavor) {
  118. for (DataFlavor f: getTransferDataFlavors()) {
  119. if (flavor.equals(f)) {
  120. return true;
  121. }
  122. }
  123. return false;
  124. }
  125. public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException,IOException {
  126. if(flavor.equals(localObjectFlavor)) {
  127. return dh.getTransferData(flavor);
  128. } else {
  129. return ss.getTransferData(flavor);
  130. }
  131. }
  132. };
  133. }
  134. @Override public boolean canImport(TransferSupport support) {
  135. if(!support.isDrop()) {
  136. return false;
  137. }
  138. return true;
  139. }
  140. @Override public int getSourceActions(JComponent c) {
  141. System.out.println("getSourceActions");
  142. DragPanel p = (DragPanel)c;
  143. label.setIcon(p.draggingLabel.getIcon());
  144. label.setText(p.draggingLabel.getText());
  145. window.pack();
  146. Point pt = p.draggingLabel.getLocation();
  147. SwingUtilities.convertPointToScreen(pt,p);
  148. window.setLocation(pt);
  149. window.setVisible(true);
  150. return MOVE;
  151. }
  152. @Override public boolean importData(TransferSupport support) {
  153. System.out.println("importData");
  154. if(!canImport(support)) return false;
  155. DragPanel target = (DragPanel)support.getComponent();
  156. try {
  157. DragPanel src = (DragPanel)support.getTransferable().getTransferData(localObjectFlavor);
  158. JLabel l = new JLabel();
  159. l.setIcon(src.draggingLabel.getIcon());
  160. l.setText(src.draggingLabel.getText());
  161. target.add(l);
  162. target.revalidate();
  163. return true;
  164. } catch(UnsupportedFlavorException ufe) {
  165. ufe.printStackTrace();
  166. } catch(java.io.IOException ioe) {
  167. ioe.printStackTrace();
  168. }
  169. return false;
  170. }
  171. @Override protected void exportDone(JComponent c,Transferable data,int action) {
  172. System.out.println("exportDone");
  173. DragPanel src = (DragPanel)c;
  174. if(action == TransferHandler.MOVE) {
  175. src.remove(src.draggingLabel);
  176. src.revalidate();
  177. src.repaint();
  178. }
  179. src.draggingLabel = null;
  180. window.setVisible(false);
  181. }
  182. }

猜你在找的Java相关文章