Drag and Drop

Status
Nicht offen für weitere Antworten.

xMisch

Mitglied
hallo allerseits,

ich bin seit zwei tagen auf der suche nach einer lösung für mein problem aber habe bisher nichts gefunden.
nun versuch ich mein glück hier.

also ich habe eine jList und möchte das wenn man ein element aus der liste per drag n drop anklickt und aus der liste rauszieht irgend eine aktion passiert.

nun habe ich das so implementiert:



Code:
public class DragAndDropExample {

	private static JList mList;
	private static JPanel mPanel;

	private static void setupList() {
		String[] items = { "hello", "lösch mich", "misch auch bitte" };
		mList = new JList(items);
		mList.setDragEnabled(true);
		mList.setPreferredSize(new Dimension(200, 400));
		mList.setDragEnabled(true);
		DropTarget dropTarget = new DropTarget(mList, listener);
	}

	public static void main(String[] args) {

		setupList();
		JFrame frame = new JFrame();
		frame.setSize(new Dimension(500, 500));
		mPanel = new JPanel();
		mPanel.add(BorderLayout.WEST, mList);
		frame.add(mPanel);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	static DropTargetListener listener = new DropTargetListener() {

		public void dragEnter(DropTargetDragEvent dtde) {
		}

		public void dragExit(DropTargetEvent dte) {
			System.out.println("Tu irgendwas!!!");
		}

		public void dragOver(DropTargetDragEvent dtde) {
		}

		public void drop(DropTargetDropEvent event) {
		}

		public void dropActionChanged(DropTargetDragEvent dtde) {
		}
	};
}

mein problem ist nun das der Text "Tu irgendwas" erscheint sobald ich die jList verlassen habe obwohl die mastaste noch gedrückt ist.
ich möchte aber das es erst erscheint, wenn ich die jList verlassen habe und ich die maustaste losgelassen habe.


kann mir da jemand helfen?
 
"dragExit" wird während eines "Drag"-vorgangs aufgerufen, wenn der Mauszeiger aus dem
funktionellen Teil des "Drop"-bereiches für das "DropTarget" herausgenommen wird.
Von daher ist die beobachtete Reaktion absolut normal.
Um dein Vorhaben zu verwirklichen, könnten wir dem "mPanel" einen
"DropTarget" geben und bei "drop" die gewünschte Aktion ausführen. Zum Beispiel:
Code:
package demo;
/*
 * DragAndDropExample.java
 */
import java.awt.*;
import java.awt.dnd.*;
import javax.swing.*;
public class DragAndDropExample extends JFrame {
    private JList mList;
    private JPanel mPanel;
    private DefaultListModel mListModel;
    public DragAndDropExample() {
        super("DragAndDropExample");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(new Dimension(500, 500));
        setLocationRelativeTo(null);
        mPanel = new JPanel();
        mListModel = new DefaultListModel();
        mListModel.addElement("hello");
        mListModel.addElement("lösch mich");
        mListModel.addElement("misch auch bitte");
        mList = new JList(mListModel);
        mList.setDragEnabled(true);
        mList.setPreferredSize(new Dimension(200, 400));
        mPanel.add(mList);
        getContentPane().add(mPanel, BorderLayout.CENTER);
        mPanel.setDropTarget(new DropTarget() {
            @Override
            public void drop(final DropTargetDropEvent event) {
                if (!mList.getBounds().contains(event.getLocation())) {
                    mListModel.remove(mList.getSelectedIndex());
                }
            }
        });
    }
    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DragAndDropExample().setVisible(true);
            }
        });
    }
}
 
Hallo André,

danke für den code beispiel!!!
das funktioniert schon mal super!
macht jetzt auch irgendwie sinn.

aber wie kann ich sicherstellen das nur auf dem jpanel gedropt werden kann?

ich habe hier mal ein ähnliches beispiel:


Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
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 javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

public class DragAndDropExample {

	private static JList mList;
	private static JPanel mMainPanel;
	private static JPanel mBinPanel;

	private static void setupList() {
		String[] listItems = { "item1", "item2", "item3", "item4", "item5",
				"item6", "item7", "item2", "item3", "item4", "item5", "item6",
				"item7" };
		mList = new JList(listItems);
		mList.setDragEnabled(true);
		mList.setPreferredSize(new Dimension(200, 300));
		mList.setDragEnabled(true);
		mList.setDropTarget(new DropTarget(mList, jListDropListener));

	}

	private static void setupBinPanel() {
		mBinPanel = new JPanel();
		mBinPanel.setVisible(false);
		mBinPanel.setPreferredSize(new Dimension(100, 100));
		mBinPanel.setDropTarget(new DropTarget(mBinPanel, jPanelDropListener));
	}

	private static void setupMainPanel() {
		mMainPanel = new JPanel();
		mMainPanel.setBackground(Color.magenta);
		mMainPanel.add(BorderLayout.WEST, mList);
		mMainPanel.add(BorderLayout.EAST, mBinPanel);
	}

	public static void main(String[] args) {

		setupList();
		setupBinPanel();
		setupMainPanel();
		JFrame frame = new JFrame();
		frame.add(mMainPanel);
		frame.setSize(new Dimension(500, 500));
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	static DropTargetListener jListDropListener = new DropTargetListener() {

		public void dragEnter(DropTargetDragEvent dtde) {
		}

		public void dragExit(DropTargetEvent dte) {
			mBinPanel.setVisible(true);
		}

		public void dragOver(DropTargetDragEvent dtde) {
			mBinPanel.setVisible(true);
		}

		public void drop(DropTargetDropEvent event) {
			mBinPanel.setVisible(false);
		}

		public void dropActionChanged(DropTargetDragEvent dtde) {
		}
	};

	static DropTargetListener jPanelDropListener = new DropTargetListener() {

		public void dragEnter(DropTargetDragEvent dtde) {

		}

		public void dragExit(DropTargetEvent dte) {
		}

		public void dragOver(DropTargetDragEvent dtde) {
		}

		public void drop(DropTargetDropEvent event) {
			mBinPanel.setVisible(false);
		}

		public void dropActionChanged(DropTargetDragEvent dtde) {
		}
	};
}

also ich will sicherstellen das nur auf dem mBinPanel gedropt werden kann.
sollte kein dropen stattfinden dann soll das mBinPanel wieder verschwinden.

mein problem ist nun das wenn ich ausserhalb von diesem mBinPanel drope dieser nicht verschwindet(obwohl es sollte).
Eigentlich möchte ich das ausserhalb von diesem mBinPanel nicht gedropt werden kann. auch nicht ausserhalb des frames auf meinem desktop. eben nur auf dem mBinPanel.

besten dank für die zeit und mühe
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben