Перетаскивание JLabel за пределы JFrame


Итак, я смотрю на это: перетаскивание jlabel по экрану

Есть ли способ перетащить JLabel (или его представление) за пределы JFrame?

Например, чтобы перетащить JLabel между JFrames, в то время как на самом деле" показывает " jlabel перетаскивается (используя http://docs.oracle.com/javase/tutorial/uiswing/dnd/intro.html )

1 2

1 ответ:

С помощью теста JWindow:

//http://stackoverflow.com/questions/4893265/dragging-a-jlabel-around-the-screen
private final JWindow window = new JWindow();
@Override
public void mouseDragged(MouseEvent me) {
  if (dragLabel == null) {
      return;
  }
  int x = me.getPoint().x - dragLabelWidthDiv2;
  int y = me.getPoint().y - dragLabelHeightDiv2;
  //dragLabel.setLocation(x, y);
  window.add(dragLabel);
  window.pack();
  Point pt = new Point(x, y);
  Component c = (Component)me.getSource();
  SwingUtilities.convertPointToScreen(pt, c);
  window.setLocation(pt);
  window.setVisible(true);
  repaint();
}
@Override public void mouseReleased(MouseEvent me) {
  window.setVisible(false);
  //...
}

Ниже не тестируется код: (возможно, потребуется немного массажа, чтобы работать, но это суть дела)

@Override public int getSourceActions(JComponent src) {
  JLabel label = (JLabel)src;
  window.add(label);
  window.pack();
  window.setVisible(true);
  return MOVE;
}
//...
DragSource.getDefaultDragSource().addDragSourceMotionListener(new DragSourceMotionListener() {
  @Override public void dragMouseMoved(DragSourceDragEvent dsde) {
    Point pt = dsde.getLocation();
    pt.translate(5, 5); // offset
    window.setLocation(pt);
  }
});