Das Beispiel in diesem Artikel beschreibt, wie Java Programmdaten mithilfe von Maus-Drag & Drop austauscht, der sogenannten Maus-Drag & Drop-Funktion. Die Drag-and-Drop-Funktion der Maus wird in grafischen Systemen sehr häufig verwendet. Zur Unterstützung dieser Funktion stellt Java die Pakete java.awt.dnd und java.awt.datatransfer zur Verfügung. Dieses Beispiel zeigt, wie Sie Drag & Drop im Programm implementieren. Wenn Sie mit der Maus auf die Beschriftung „Hallo Welt!“ im oberen Teil des Fensters klicken und sie in das Textfeld im unteren Teil des Fensters ziehen World!" wird dem Textfeld hinzugefügt. !" Fahren Sie mit dem obigen Vorgang fort und der Text wird weiterhin hinzugefügt.
Die spezifischen Implementierungsideen und -methoden der Programmfunktion lauten wie folgt: Bei der Implementierung von Maus-Drag & Drop sind die beiden wichtigsten Konzepte Drag-Quelle und Drop-Ziel, nämlich Drag-Quelle und Drop-Ziel. Sowohl die Drag-Quelle als auch das Drop-Ziel sind mit der sichtbaren Komponente verknüpft (wie kann man ziehen, wenn sie nicht sichtbar ist?!). Der Kern der Drag-and-Drop-Technologie besteht darin, die Daten auf der Drag-and-Drop-Quellkomponente auf die Platzierungszielkomponente zu übertragen. Daher ist Drag-and-Drop aus einer einfachen Perspektive der Zwischenablage-Technologie sehr ähnlich im obigen Beispiel.
Implementierung der Drag-Source: Die Drag-Source-Klasse muss zunächst eine DragGestureRecognizer-Instanz erstellen, die angibt, dass die Klasse eine Drag-Source-Komponentenklasse ist oder eine Drag-Source-Komponente enthält. Dies kann durch Aufrufen der Methode createDefaultDragGestureRecognizer() des DataSource-Objekts erreicht werden. Die spezifische Implementierung ist wie folgt:
int action = DnDConstants.ACTION_COPY_OR_MOVE; //Drag-and-Drop-Typ ds.createDefaultDragGestureRecognizer(this,action,this);
Die obige Anweisung zeigt, dass die Drag-Source-Komponente ein Instanzobjekt dieser Klasse selbst ist, der Typ des abzuschließenden Drag & Drop vom Typ DnDConstants.ACTION_COPY_OR_MOVE ist und die Klasse, die die DragGestureListener-Schnittstelle implementiert, diese Klasse ist. Die Drag-Quelle implementiert im Allgemeinen die DragGestureListener-Schnittstelle, die eine DragGestureRecognized()-Methode definiert. Wenn das Ziehen beginnt, lauscht der DragGestureListener auf das Ereignis und überträgt es dann zur DragGestureRecognized()-Methode, um das Ereignis zu verarbeiten, z. B. die Drag-Daten zu senden Quelle. Spezifischer Code:
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Methode dragGestureRecognized() noch nicht implementiert."); try{Transferable tr = new StringSelection(this.getText()); //Transfer the label's Text als Daten, von Transferable Objektverpackung // Beginnen Sie mit dem Ziehen, setzen Sie den Cursor auf die Form DragSource.DefaultCopyNoDrop, die Drag-and-Drop-Daten sind ein tr-Objekt und DragSourceListener ist diese Klasse dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {fehler. printStackTrace();}}
Die Drag-Quelle muss auch die DragSourceListener-Schnittstelle implementieren, die Ereignisbehandlungsmethoden für jeden Status im Zusammenhang mit Drag & Drop definiert. Wie DragEnter, DragOver, DropActionChanged, DragExit und andere Methoden. In diesem Beispiel wird die Methode „dragEnter()“ implementiert, um die Cursorform während des Ziehens festzulegen, und andere Methoden sind leere Methoden. Der spezifische Implementierungscode lautet wie folgt:
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Methode dragEnter() noch nicht implementiert.");DragSourceContext dsc = dsde.getDragSourceContext(); //Kontextreferenz der Drag-Quelle abrufen/ / Legen Sie die Cursorform beim Ziehen fest int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
Implementierung des Drop-Ziels: Zuerst muss in der Drop-Ziel-Klasse eine DragTarget-Instanz erstellt werden, um anzugeben, dass diese Klasse eine Drop-Ziel-Komponentenklasse ist oder eine Drop-Ziel-Komponente enthält. Die Implementierung ist wie folgt:
new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
Die obige Anweisung zeigt, dass das Drop-Ziel das Objekt this.jTextField1 ist, der Drag-and-Drop-Vorgang vom Typ DnDConstants.ACTION_COPY_OR_MOVE ist und die Klasse, die die DropTargetListener-Schnittstelle implementiert, diese Klasse ist. Entsprechend DrafSourceListener implementiert das Drop-Ziel oder seine Klasse im Allgemeinen die DropTargetListener-Schnittstelle. Diese Schnittstelle definiert auch viele Methoden wie DragEnter, DragOver usw. zur Behandlung von Ereignissen, wenn der Drag-and-Drop-Prozess in verschiedene Phasen eintritt. In diesem Beispiel geht es nur um die Methode drop(), bei der es sich um die Ereignisverarbeitung handelt, wenn die Maus auf der Platzierungszielkomponente losgelassen wird. Sie wird im Allgemeinen zum Verarbeiten der übergebenen Textdaten verwendet Wird in der JTextField-Komponente angezeigt. Andere Die Methode ist eine leere Methode, der spezifische Code lautet wie folgt:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Methode drop() noch nicht implementiert.");try{Transferable tr = dtde.getTransferable(); //Das übergebene Datenobjekt abrufen/ / Verarbeiten Sie das Datenobjekt und rufen Sie die Textinformationen ab, wenn (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //Anzeige der von der Drag-Quelle übergebenen Textinformationen auf dem Drop-Ziel dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
Programmcode:
1. Erstellen Sie ein neues Projekt und nennen Sie es JDragAndDropDemo.
2. Erstellen Sie eine neue Anwendung und nennen Sie sie JDragAndDropDemo. Benennen Sie das Hauptfenster MainFrame und nennen Sie es JDragAndDropDemo.
3. Erstellen Sie eine neue Klasse, nennen Sie sie DragJLabel und erben Sie die JLabel-Klasse.
4. Verwenden Sie die Schnittstelle „wizards|implements“, damit die DragJLabel-Klasse die Schnittstellen „DragGestureListener“ und „DragSourceListener“ implementiert.
5. Fügen Sie ein neues Attribut DragSource ds in der Klasse DragJLabel hinzu. Der Code lautet wie folgt:
Klasse DragJLabel erweitert JLabel implementiert DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource(); //Eine DragSource-Instanz erstellen...}
6. Schreiben Sie die Konstruktormethode der DragJLabel-Klasse.
public DragJLabel(String title,intalignment){super(title,alignment); //Verwenden Sie die Methode der übergeordneten Klasse int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this);
7. Implementieren Sie die Methode „dragGestureRecognized()“ in der DragJLabel-Klasse, umschließen und senden Sie Daten.
public void dragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("Methode dragGestureRecognized() noch nicht implementiert.");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(Exception err){err.printStackTrace();}}
8. Implementieren Sie die Methode „dragEnter()“ in der Klasse „DragJLabel“, um die Form des Cursors festzulegen.
public void dragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("Methode dragEnter() noch nicht implementiert.");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. Fügen Sie im unteren Teil des Designfensters der MainFrame-Klasse eine JTextField-Komponente hinzu und erstellen Sie eine DragJLabel-Instanz in der Klasse. Der spezifische Code lautet wie folgt:
öffentliche Klasse MainFrame erweitert JFrame implementiert DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Hello World!",SwingConstants.CENTER);……}
10. Schreiben Sie die Initialisierungsmethode jbInit() der MainFrame-Klasse, legen Sie die Anfangseigenschaften der Komponente fest und erstellen Sie eine neue DropTarget-Instanz. Der Code lautet wie folgt:
private void jbInit() löst eine Ausnahme aus {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Ihr Symbol]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(new Dimension(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(this .label,BorderLayout.NORTH);neu DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. Verwenden Sie die Schnittstelle „wizards|implements“, damit die MainFrame-Klasse die Schnittstelle „DropTargetListener“ implementiert.
12. Implementieren Sie die von der DropTargetListener-Schnittstelle geerbte Methode drop(), um die übergebenen Daten zu verarbeiten. Der spezifische Code lautet wie folgt:
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("Methode drop() noch nicht implementiert.");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){ err.printStackTrace();}}