2016-04-13 12 views
0

以下の例では、ドラッグアンドドロップをトリガする標準的な方法があります。これはmousePress + mouseMoveです。java Swing DnD apiを使用してmousePressedでドラッグを開始することはできますか?

import javax.swing.*; 
import java.awt.datatransfer.StringSelection; 
import java.awt.dnd.DnDConstants; 
import java.awt.dnd.DragGestureListener; 
import java.awt.dnd.DragSource; 

public class DndExample extends JFrame { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new DndExample()); 
    } 

    public DndExample() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel dragLabel = createDndLabel(); 
     getContentPane().add(dragLabel); 
     pack(); 
     setVisible(true); 
    } 

    private JLabel createDndLabel() { 
     JLabel label = new JLabel("Drag me, please"); 


     DragGestureListener dragGestureListener = (dragTrigger) -> { 
      dragTrigger.startDrag(null, new StringSelection(label.getText())); 
     }; 

     DragSource dragSource = DragSource.getDefaultDragSource(); 
     dragSource.createDefaultDragGestureRecognizer(label, DnDConstants.ACTION_COPY, dragGestureListener); 

     return label; 
    } 
} 

mouseMoveを使用せずにmousePressedでstartDragをトリガすることは可能ですか?目的の動作は次のようなものです:私はマウスボタンを押した後、ドラッグが開始されたことを示すカーソル変更を行います。私は明らかにMouseListenerを追加してカーソルを手動で変更することができますが、以前のカーソルを復元するためにはるかに多くのコードが必要です。

+0

を登録(アイテムをクリックしたい人とそれをドラッグしたい人の間で)プレスとドラッグ操作 – MadProgrammer

+0

@MadProgrammerドラッグだけをサポートする必要があるとしましょう(UIの正確性について話したくない、それは顧客の要求です) –

+0

あなたが言ったように、1つの 'MousePressed'はカーソルを' MouseRelased'にセットしてカーソルを再び戻します – MadProgrammer

答えて

1

あなたは非標準的な動作のために求めているので、自分自身を持ち上げる「余分」を行うために必要になるだろう、これはmousePressedMouseListenerがそれを休んでカーソルとmouseReleasedを設定する(その場合持ってする必要がありますユーザーはちょうどクリックしてコンポーネントをドラッグしません、あなたは愚かなカーソル状態に終わらない)とDragGestureListener#dragDropEndもカーソルをリセットします。今

DragDrop

import java.awt.Color; 
import java.awt.Cursor; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.awt.dnd.DnDConstants; 
import java.awt.dnd.DragGestureEvent; 
import java.awt.dnd.DragGestureListener; 
import java.awt.dnd.DragSource; 
import java.awt.dnd.DragSourceDragEvent; 
import java.awt.dnd.DragSourceDropEvent; 
import java.awt.dnd.DragSourceEvent; 
import java.awt.dnd.DragSourceListener; 
import java.awt.dnd.DropTarget; 
import java.awt.dnd.DropTargetDragEvent; 
import java.awt.dnd.DropTargetDropEvent; 
import java.awt.dnd.DropTargetEvent; 
import java.awt.dnd.DropTargetListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.LineBorder; 
import javax.swing.border.MatteBorder; 

public class DragAndDropTest { 

    public static void main(String[] args) { 
     new DragAndDropTest(); 
    } 

    public DragAndDropTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridLayout(1, 2)); 
      add(new DropPane()); 
      add(new DragPane()); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class DragPane extends JPanel { 

     private DragSource ds; 
     private Transferable transferable; 

     public DragPane() { 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mousePressed(MouseEvent e) { 
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 
       } 

       @Override 
       public void mouseReleased(MouseEvent e) { 
        setCursor(Cursor.getDefaultCursor()); 
       } 
      }); 
      ds = new DragSource(); 
      transferable = new Transferable() { 

       @Override 
       public DataFlavor[] getTransferDataFlavors() { 
        return new DataFlavor[]{DataFlavor.stringFlavor}; 
       } 

       @Override 
       public boolean isDataFlavorSupported(DataFlavor flavor) { 
        return DataFlavor.stringFlavor.equals(flavor); 
       } 

       @Override 
       public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
        return "This is a test"; 
       } 
      }; 
      ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() { 
       @Override 
       public void dragGestureRecognized(DragGestureEvent dge) { 
        // This is where you would export the data you want 
        // to transfer 
        ds.startDrag(dge, Cursor.getPredefinedCursor(Cursor.HAND_CURSOR), transferable, new DragSourceListener() { 

         @Override 
         public void dragEnter(DragSourceDragEvent dsde) { 
         } 

         @Override 
         public void dragOver(DragSourceDragEvent dsde) { 
         } 

         @Override 
         public void dropActionChanged(DragSourceDragEvent dsde) { 
         } 

         @Override 
         public void dragExit(DragSourceEvent dse) { 
         } 

         @Override 
         public void dragDropEnd(DragSourceDropEvent dsde) { 
          setCursor(Cursor.getDefaultCursor()); 
         } 

        }); 
       } 
      }); 

      setLayout(new GridBagLayout()); 
      add(new JLabel("Drag from here")); 
      setBorder(new LineBorder(Color.RED)); 
     } 

    } 

    public class DropPane extends JPanel { 

     private List<Point> dropPoints; 

     public DropPane() { 
      dropPoints = new ArrayList<>(25); 
      setDropTarget(new DropTarget(this, new DropTargetListener() { 

       @Override 
       public void dragEnter(DropTargetDragEvent dtde) { 
       } 

       @Override 
       public void dragOver(DropTargetDragEvent dtde) { 
       } 

       @Override 
       public void dropActionChanged(DropTargetDragEvent dtde) { 
       } 

       @Override 
       public void dragExit(DropTargetEvent dte) { 
       } 

       @Override 
       public void drop(DropTargetDropEvent dtde) { 
        // Normally here, I'd inspect the Transferable and make sure 
        // what is been dropped and can be imported, I'd then go through 
        // the process of unwrapping the data from the Transferable and 
        // processing it appropriatly, but in this example, I really don't 
        // care, I just care about WHERE the event occured 
        dropPoints.add(dtde.getLocation()); 
        dtde.dropComplete(true); 
        repaint(); 
       } 
      })); 
      setLayout(new GridBagLayout()); 
      add(new JLabel("Drop to here")); 
      setBorder(new MatteBorder(1, 1, 1, 0, Color.RED)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      for (Point p : dropPoints) { 
       g.fillOval(p.x - 2, p.y - 2, 5, 5); 
      } 
     } 

    } 

} 

、それが好転し、あなたにどのような方法

をバイトかもしれないので、私が書いて検討するかもしれない、あなたは、システムがあなたがしたくない何かをやっている、覚えています工場出荷時のComponentへの参照を取った方法、Transferable(そしておそらくCursor)および構築し、あなたは区別するにはどうすればよいMouseListenerDragSource

関連する問題