3434import java .awt .dnd .DragGestureEvent ;
3535import java .awt .dnd .DragGestureListener ;
3636import java .awt .dnd .DragSource ;
37+ import java .awt .dnd .DragSourceAdapter ;
38+ import java .awt .dnd .DragSourceDropEvent ;
3739import java .awt .dnd .DropTarget ;
3840import java .awt .dnd .DropTargetAdapter ;
3941import java .awt .dnd .DropTargetDragEvent ;
@@ -53,12 +55,12 @@ public class HeaderComponent extends JPanel implements DragGestureListener {
5355 Icon icon ;
5456
5557 JLabel displayedNumber ;
56-
58+
5759 Title displayedHeaderTitle ;
58-
60+
5961 JPanel headerContent ;
6062 TextArea textArea ;
61-
63+
6264 JPopupMenu popupMenu ;
6365
6466 Color backgroundColor ;
@@ -69,18 +71,22 @@ public class HeaderComponent extends JPanel implements DragGestureListener {
6971 static final Color FOCUS_COLOR = new Color (214 , 220 , 229 );
7072 static final Color DND_TARGET_HOVERCOLOR = new Color (143 , 170 , 220 );
7173 static final Color DND_TARGET_COLOR = new Color (180 , 199 , 231 );
72-
74+
7375 protected Header connectedHeader ;
7476 public static JPanel parentContainer ;
7577
7678 JPanel dropPanel ;
77-
79+
80+ static volatile DropTargetListenerHeaderComponents lastDropTarget = null ;
7881 JLabel dropUp ;
7982 JLabel dropDown ;
8083 JLabel dropSub ;
8184 JPanel dropUpPanel ;
8285 JPanel dropDownPanel ;
8386 JPanel dropSubPanel ;
87+ DropTargetListenerHeaderComponents dropUpTarget ;
88+ DropTargetListenerHeaderComponents dropDownTarget ;
89+ DropTargetListenerHeaderComponents dropSubTarget ;
8490
8591 /**
8692 * Constructor for the HeaderComponent. Displays the whole Container with
@@ -113,6 +119,10 @@ public HeaderComponent(Color backgroundColor, Header connectedHeader) {
113119 DragSource ds = new DragSource ();
114120 ds .createDefaultDragGestureRecognizer (this , DnDConstants .ACTION_MOVE , this );
115121
122+ HeaderComponentDragSourceAdapter dragSourceAdapter = new HeaderComponentDragSourceAdapter ();
123+ ds .addDragSourceMotionListener (dragSourceAdapter );
124+ ds .addDragSourceListener (dragSourceAdapter );
125+
116126 generateAddingActions ();
117127 generateShiftingActions ();
118128
@@ -211,12 +221,16 @@ public void dragOver(DropTargetDragEvent dtde) {
211221 enterAction ();
212222 }
213223
214- private void enterAction () {
224+ private void enterAction () {
225+ //remove the DnDTargetElements from last HoveredElement.
226+ //and now set the current to the lastDropTarget.
227+ if (lastDropTarget != null ) { lastDropTarget .removeDnDTargetElements ();}
228+ lastDropTarget = dropUpTarget ;
215229 setSize (getWidth (), dropPanel .getHeight ());
216230 remove (headerTitle );
217231 add (dropPanel , BorderLayout .CENTER );
218232 repaint ();
219- revalidate ();
233+ revalidate ();
220234 }
221235
222236 @ Override
@@ -910,9 +924,9 @@ private void setUpDropElements() {
910924 dropPanel .setVisible (true );
911925
912926 // Sets the panels as drop Targets
913- new DropTargetListenerHeaderComponents (dropUpPanel , Direction .UP );
914- new DropTargetListenerHeaderComponents (dropDownPanel , Direction .DOWN );
915- new DropTargetListenerHeaderComponents (dropSubPanel , Direction .SUB );
927+ dropUpTarget = new DropTargetListenerHeaderComponents (dropUpPanel , Direction .UP );
928+ dropDownTarget = new DropTargetListenerHeaderComponents (dropDownPanel , Direction .DOWN );
929+ dropSubTarget = new DropTargetListenerHeaderComponents (dropSubPanel , Direction .SUB );
916930 }
917931
918932 /**
@@ -929,6 +943,15 @@ public void dragGestureRecognized(DragGestureEvent dge) {
929943 dge .startDrag (cursor , new TransferableHeaderComponent (component ));
930944 }
931945
946+ private class HeaderComponentDragSourceAdapter extends DragSourceAdapter {
947+ @ Override
948+ public void dragDropEnd (DragSourceDropEvent dsde ) {
949+ //CleanUp, if the user dropped wrong and the dropTargets Were not removed yet.
950+ if (!dsde .getDropSuccess () && lastDropTarget != null ){
951+ lastDropTarget .removeDnDTargetElements ();
952+ }
953+ }
954+ }
932955 private class DropTargetListenerHeaderComponents extends DropTargetAdapter {
933956 private JPanel target ;
934957 private Direction direction ;
@@ -943,7 +966,7 @@ public DropTargetListenerHeaderComponents(JPanel target, Direction direction) {
943966 * Removes the Drag and Drop Target Element, for example when the user is not in
944967 * the Header anymore
945968 */
946- private void removeDnDTargetElements () {
969+ protected void removeDnDTargetElements () {
947970 remove (dropPanel );
948971 add (headerTitle , BorderLayout .CENTER );
949972 repaint ();
@@ -1056,7 +1079,7 @@ public void dragOver(DropTargetDragEvent dtde) {
10561079 }
10571080
10581081 @ Override
1059- public void dragEnter (DropTargetDragEvent dtde ) {
1082+ public void dragEnter (DropTargetDragEvent dtde ) {
10601083 setUpHoverColor ();
10611084 }
10621085
@@ -1164,3 +1187,4 @@ else if (flavor.equals(DataFlavor.stringFlavor))
11641187 throw new UnsupportedFlavorException (flavor );
11651188 }
11661189}
1190+
0 commit comments