Java 在JPanel周围移动JLabel

Java 在JPanel周围移动JLabel,java,swing,drag-and-drop,jlabel,Java,Swing,Drag And Drop,Jlabel,我有一个JPanel,上面有2+JLables,我希望能够抓取一个标签,然后将其移动到JPanel上的其他位置。我该怎么做?我能找到的唯一东西是将标签从组件“a”移动到组件“B”,而不是在面板上移动标签。开始玩这个: public class ComponentDragger extends MouseAdapter { private Component target; /** * {@inheritDoc} */ @Override

我有一个JPanel,上面有2+JLables,我希望能够抓取一个标签,然后将其移动到JPanel上的其他位置。我该怎么做?我能找到的唯一东西是将标签从组件“a”移动到组件“B”,而不是在面板上移动标签。

开始玩这个:

public class ComponentDragger extends MouseAdapter {

     private Component target;

    /**
     * {@inheritDoc}
     */
    @Override
    public void mousePressed(MouseEvent e) {
        Container container = (Container) e.getComponent();
        for (Component c : container.getComponents()) {
            if (c.getBounds().contains(e.getPoint())) {
                target = c;
                break;
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void mouseDragged(MouseEvent e) {
        if (target != null) {
            target.setBounds(e.getX(), e.getY(), target.getWidth(), target.getHeight());
            e.getComponent().repaint();
            }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void mouseReleased(MouseEvent e) {
        target = null;
    }

    public static void main(String[] args) {
        JLabel label = new JLabel("Drag Me");
        JPanel panel = new JPanel();
        panel.add(label);
        ComponentDragger dragger = new ComponentDragger();
        panel.addMouseListener(dragger);
        panel.addMouseMotionListener(dragger);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(1024, 768);
        f.add(panel);
        f.setVisible(true);
        panel.setLayout(null);
        f.setState(Frame.MAXIMIZED_BOTH);
    }
}

下面是另一个例子,其中MouseListener和MouseMotionListener位于JLabel上。要使其工作,它需要知道鼠标在屏幕上的位置,而不是最初按下鼠标时鼠标在屏幕上的初始位置

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class MovingLabels {
   private static final int PREF_W = 800;
   private static final int PREF_H = 600;

   private static void createAndShowGui() {
      Random random = new Random();
      final JPanel panel = new JPanel();

      Color[] colors = {Color.red, Color.orange, Color.yellow, Color.green, Color.blue, Color.cyan};
      panel.setPreferredSize(new Dimension(PREF_W, PREF_H)); // sorry kleopatra
      panel.setLayout(null);

      MyMouseAdapter myMouseAdapter = new MyMouseAdapter();

      for (int i = 0; i < colors.length; i++) {
         Color c = colors[i];
         JLabel label = new JLabel("Label " + (i + 1));
         Border outsideBorder = new LineBorder(Color.black);
         int eb = 10;
         Border insideBorder = new EmptyBorder(eb, eb, eb, eb);
         label.setBorder(BorderFactory.createCompoundBorder(outsideBorder , insideBorder));
         label.setSize(label.getPreferredSize());
         label.setBackground(c);
         label.setOpaque(true);
         int x = random.nextInt(PREF_W - 200) + 100;
         int y = random.nextInt(PREF_H - 200) + 100;
         label.setLocation(x, y);
         label.addMouseListener(myMouseAdapter);
         label.addMouseMotionListener(myMouseAdapter);
         panel.add(label);
      }

      JFrame frame = new JFrame("MovingLabels");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyMouseAdapter extends MouseAdapter {

   private Point initialLoc;
   private Point initialLocOnScreen;

   @Override
   public void mousePressed(MouseEvent e) {
      Component comp = (Component)e.getSource();
      initialLoc = comp.getLocation();
      initialLocOnScreen = e.getLocationOnScreen();
   }

   @Override
   public void mouseReleased(MouseEvent e) {
      Component comp = (Component)e.getSource();
      Point locOnScreen = e.getLocationOnScreen();

      int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
      int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
      comp.setLocation(x, y);
   }

   @Override
   public void mouseDragged(MouseEvent e) {
      Component comp = (Component)e.getSource();
      Point locOnScreen = e.getLocationOnScreen();

      int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
      int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
      comp.setLocation(x, y);
   }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.Random;
导入javax.swing.*;
导入javax.swing.border.border;
导入javax.swing.border.EmptyBorder;
导入javax.swing.border.LineBorder;
公共类移动标签{
专用静态最终整型预调W=800;
专用静态最终整型参数参数H=600;
私有静态void createAndShowGui(){
随机=新随机();
最终JPanel面板=新JPanel();
Color[]colors={Color.red,Color.orange,Color.yellow,Color.green,Color.blue,Color.cyan};
panel.setPreferredSize(新维度(PREF_W,PREF_H));//对不起,kleopatra
panel.setLayout(空);
MyMouseAdapter MyMouseAdapter=新的MyMouseAdapter();
for(int i=0;i
您可能会从标签本身获得它。试着观察面板的坐标。它应该能用

以下是我想要的:

public class LayerItem extends JLabel{

    protected int lblYPt = 0;

    public LayerItem(JPanel layers){
        this.addMouseListener(new MouseAdapter(){
            @Override
             public void mousePressed(MouseEvent evt){
                 lblMousePressed(evt);
             }
        });

        this.addMouseMotionListener(new MouseAdapter(){
            @Override
            public void mouseDragged(MouseEvent evt){
                lblMouseDragged(evt);
            }
        });
    }

    public void lblMousePressed(MouseEvent evt){
        lblYPt = evt.getY();
    }

    public void lblMouseDragged(MouseEvent evt){
        Component parent = evt.getComponent().getParent();
        Point mouse = parent.getMousePosition();
        try{
            if(mouse.y - lblYPt >= 30){
                this.setBounds(0, mouse.y - lblYPt, 198, 50);
            }
        }catch(Exception e){
        }
    }
}

考虑使用MouSististor和MouseMotionListener,并给出JPAND(颤抖)空布局。如果你玩这个,你可能会有进步。好吧,我让它移动,但它移动起来很奇怪。我使用的是“mouseDragged()”,其中:
inty=evt.getY();这个.挫折(0,y,198,50)但当它移动时,它会抖动,并且不会移动到鼠标位于面板中的位置。你知道为什么吗?那么你没有正确地实施它。考虑创建和发布一个演示你的问题。我知道了,我用鼠标在标签上的Y位置,我应该使用鼠标在面板上的Y位置。@ HoviCRAFtFulfFoeles从来没有想过你会建议<代码> null <代码>布局。我推荐