السلام عليكم ورحمة الله وبركاته
لقد قرأت منذ مدة في هذا المنتدى 'من طرف أحد الاعضاء' ان الجافا لا تدعم تقنية الـ Drag & Drop :sad: ، وقتها حزنت كثيييييرا :blush: كونها تعد من أفضل التقنيات التي أحبها وأحب استعمالها :sleep: ... الى أن عثرت على مثال في أحد المواقع 'لا أتذكره كوني كثييير التجوال هنا وهناك' وهو مثال وااايد حلو لكني لم افهمه بصورة كاملة ولكن ومع ذلك أردت ان أفيد به من لا يعلم بالامر
... هنا 3 كلاسات :
- TestDND
- DNDList
- DNDComponentInterface
سأضعها كاملة بدون أي تغيير
/**
* The tester class for the DNDList. This class creates the lists,
* positions them in a frame, populates the list with the default
* data.
*
* @version 1.0
*
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestDND
{
public static void main (String args[]) {
TestDND testDND = new TestDND();
}
/**
* constructor
* creates the frame, the lists in it and sets the data in the lists
*/
public TestDND()
{
JFrame f = new JFrame("Drag and Drop Lists");
DNDList sourceList = new DNDList();
// add data to the source List
DefaultListModel sourceModel = new DefaultListModel();
sourceModel.addElement( "Source Item1");
sourceModel.addElement( "Source Item2");
sourceModel.addElement( "Source Item3");
sourceModel.addElement( "Source Item4");
// gets the panel with the List and a heading for the List
JPanel sourcePanel = getListPanel(sourceList, "SourceList", sourceModel);
DNDList targetList = new DNDList();
// add data to the target List
DefaultListModel targetModel = new DefaultListModel();
targetModel.addElement( "Target Item1");
targetModel.addElement( "Target Item2");
targetModel.addElement( "Target Item3");
targetModel.addElement( "Target Item4");
JPanel targetPanel = getListPanel(targetList, "TargetList", targetModel);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.X_AXIS));
mainPanel.add( sourcePanel );
mainPanel.add( targetPanel );
f.getContentPane().add( mainPanel );
f.setSize (300, 300);
f.addWindowListener (new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible (true);
}
/**
* a convenience method
* used for positioning of the ListBox and the Label.
*
* @param list - the special DND List
* @param labelName - the heading for the list
* @param listModel - model for the list
*/
private JPanel getListPanel(DNDList list, String labelName, DefaultListModel listModel ){
JPanel listPanel = new JPanel();
JScrollPane scrollPane = new JScrollPane(list);
list.setModel(listModel);
JLabel nameListName = new JLabel(labelName );
listPanel.setLayout( new BorderLayout());
listPanel.add(nameListName, BorderLayout.NORTH);
listPanel.add( scrollPane, BorderLayout.CENTER);
return listPanel;
}
}/**
* This is an example of a component, which serves as a DragSource as
* well as Drop Target.
* To illustrate the concept, JList has been used as a droppable target
* and a draggable source.
* Any component can be used instead of a JList.
* The code also contains debugging messages which can be used for
* diagnostics and understanding the flow of events.
*
* @version 1.0
*/
import java.awt.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.util.Hashtable;
import java.util.List;
import java.util.Iterator;
import java.io.*;
import java.io.IOException;
import javax.swing.JList;
import javax.swing.DefaultListModel;
public class DNDList extends JList
implements DNDComponentInterface, DropTargetListener,DragSourceListener, DragGestureListener {
/**
* enables this component to be a dropTarget
*/
DropTarget dropTarget = null;
/**
* enables this component to be a Drag Source
*/
DragSource dragSource = null;
/**
* constructor - initializes the DropTarget and DragSource.
*/
public DNDList() {
dropTarget = new DropTarget (this, this);
dragSource = new DragSource();
dragSource.createDefaultDragGestureRecognizer( this, DnDConstants.ACTION_MOVE, this);
}
/**
* is invoked when you are dragging over the DropSite
*
*/
public void dragEnter (DropTargetDragEvent event) {
// debug messages for diagnostics
System.out.println( "dragEnter");
event.acceptDrag (DnDConstants.ACTION_MOVE);
}
/**
* is invoked when you are exit the DropSite without dropping
*
*/
public void dragExit (DropTargetEvent event) {
System.out.println( "dragExit");
}
/**
* is invoked when a drag operation is going on
*
*/
public void dragOver (DropTargetDragEvent event) {
System.out.println( "dragOver");
}
/**
* a drop has occurred
*
*/
public void drop (DropTargetDropEvent event) {
try {
Transferable transferable = event.getTransferable();
// we accept only Strings
if (transferable.isDataFlavorSupported (DataFlavor.stringFlavor)){
event.acceptDrop(DnDConstants.ACTION_MOVE);
String s = (String)transferable.getTransferData ( DataFlavor.stringFlavor);
addElement( s );
event.getDropTargetContext().dropComplete(true);
}
else{
event.rejectDrop();
}
}
catch (IOException exception) {
exception.printStackTrace();
System.err.println( "Exception" + exception.getMessage());
event.rejectDrop();
}
catch (UnsupportedFlavorException ufException ) {
ufException.printStackTrace();
System.err.println( "Exception" + ufException.getMessage());
event.rejectDrop();
}
}
/**
* is invoked if the use modifies the current drop gesture
*
*/
public void dropActionChanged ( DropTargetDragEvent event ) {
}
/**
* a drag gesture has been initiated
*
*/
public void dragGestureRecognized( DragGestureEvent event) {
Object selected = getSelectedValue();
if ( selected != null ){
StringSelection text = new StringSelection( selected.toString());
// as the name suggests, starts the dragging
dragSource.startDrag (event, DragSource.DefaultMoveDrop, text, this);
} else {
System.out.println( "nothing was selected");
}
}
/**
* this message goes to DragSourceListener, informing it that the dragging
* has ended
*
*/
public void dragDropEnd (DragSourceDropEvent event) {
if ( event.getDropSuccess()){
removeElement();
}
}
/**
* this message goes to DragSourceListener, informing it that the dragging
* has entered the DropSite
*
*/
public void dragEnter (DragSourceDragEvent event) {
System.out.println( " dragEnter");
}
/**
* this message goes to DragSourceListener, informing it that the dragging
* has exited the DropSite
*
*/
public void dragExit (DragSourceEvent event) {
System.out.println( "dragExit");
}
/**
* this message goes to DragSourceListener, informing it that the dragging is currently
* ocurring over the DropSite
*
*/
public void dragOver (DragSourceDragEvent event) {
System.out.println( "dragExit");
}
/**
* is invoked when the user changes the dropAction
*
*/
public void dropActionChanged ( DragSourceDragEvent event) {
System.out.println( "dropActionChanged");
}
/**
* adds elements to itself
*
*/
public void addElement( Object s ){
(( DefaultListModel )getModel()).addElement (s.toString());
}
/**
* removes an element from itself
*/
public void removeElement(){
(( DefaultListModel)getModel()).removeElement( getSelectedValue());
}
}public interface DNDComponentInterface{
public void addElement( Object s);
public void removeElement();
}المثال يستعمل JList * 2 فمن خلالهما نستطيع "سحب وافلات" الـ Items
المثال وااايد حلو وانا بصراحة عجبني واذا كان هناك أمثلة لتقنيات وأكواد جميلة فـــــــــرجاءا شاركونا اياها
تقبلوا تحيات اخوكم ناجي :lol:



