Code
//Display "DropLocation" using JLayer
class DropLocationLayerUI extends LayerUI {
private static final int LINEWIDTH = 3;
private final Rectangle lineRect = new Rectangle();
@Override public void paint(Graphics g, JComponent c) {
super.paint (g, c);
JLayer layer = (JLayer)c;
DnDTabbedPane tabbedPane = (DnDTabbedPane)layer.getView();
DnDTabbedPane.DropLocation loc = tabbedPane.getDropLocation();
if(loc != null && loc.isDropable() && loc.getIndex()>=0) {
int index = loc.getIndex();
boolean isZero = index==0;
Rectangle r = tabbedPane.getBoundsAt(isZero?0:index-1);
if(tabbedPane.getTabPlacement()==JTabbedPane.TOP ||
tabbedPane.getTabPlacement()==JTabbedPane.BOTTOM) {
lineRect.setRect(
r.x-LINEWIDTH/2+r.width*(isZero?0:1), r.y,LINEWIDTH,r.height);
}else{
lineRect.setRect(
r.x,r.y-LINEWIDTH/2+r.height*(isZero?0:1), r.width,LINEWIDTH);
}
Graphics2D g2 = (Graphics2D)g.create();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.setColor(Color.RED);
g2.fill(lineRect);
g2.dispose();
}
}
}
private final JLabel label = new JLabel() {
// https://free-the-pixel.blogspot.com/2010/04/ghost-drag-and-drop-over-multiple.html
// Free the pixel: GHOST drag and drop, over multiple windows]
@Override public boolean contains(int x, int y) {
return false;
}
};
private final JWindow dialog = new JWindow();
public TabTransferHandler() {
dialog.add(label);
//dialog.setAlwaysOnTop(true); // Web Start
dialog.setOpacity(0.5f);
//com.sun.awt.AWTUtilities.setWindowOpacity(dialog, 0.5f); // JDK 1.6.0
DragSource.getDefaultDragSource().addDragSourceMotionListener(
new DragSourceMotionListener() {
@Override public void dragMouseMoved(DragSourceDragEvent dsde) {
Point pt = dsde.getLocation();
pt.translate(5, 5); // offset
dialog.setLocation(pt);
}
});
//...
References