在Swing中添加另一个可移动图像

在Swing中添加另一个可移动图像,swing,Swing,我在一个问题上苦苦思索。我想做的是在JPanel中添加另一个可移动的图像,可以移动,就像用鼠标拖动一样。该程序一次只能查看一个图像并将其拖动到周围。那么,我怎样才能在我的程序中有多张图片呢? =) 这是我的密码: import java.awt.*; import javax.swing.*; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; public class test2 { public sta

我在一个问题上苦苦思索。我想做的是在JPanel中添加另一个可移动的图像,可以移动,就像用鼠标拖动一样。该程序一次只能查看一个图像并将其拖动到周围。那么,我怎样才能在我的程序中有多张图片呢? =)

这是我的密码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
public class test2 {

public static void main(String[] args) {
    new test2();
}

public test2() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
            } catch (InstantiationException ex) {
            } catch (IllegalAccessException ex) {
            } catch (UnsupportedLookAndFeelException ex) {
            }
            JFrame frame = new JFrame();
            Bild bild = new Bild();
            frame.add(new DragMyIcon("katt.gif"));
            frame.setSize(640,460);
            frame.setVisible(true);

        }
   });
}

protected class DragMyIcon extends JPanel {

    public static final long serialVersionUID = 172L;
    private JLabel label;

    public DragMyIcon(String path) {
        setLayout(null);
        ImageIcon icon = null;
        icon = new ImageIcon(path);
        label = new JLabel(icon);
        label.setBounds(0,0,icon.getIconWidth(), icon.getIconHeight());
        setBounds(0,0,icon.getIconWidth(), icon.getIconHeight());
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setVerticalAlignment(JLabel.CENTER);
        add(label);

        MouseHandler handler = new MouseHandler();
        label.addMouseListener(handler);
        label.addMouseMotionListener(handler);
    }
}

protected class MouseHandler extends MouseAdapter {

    private boolean active = false;
    private int xDisp;
    private int yDisp;

    @Override
    public void mousePressed(MouseEvent e) {
        active = true;
        JLabel label = (JLabel) e.getComponent();
        xDisp = e.getPoint().x - label.getLocation().x;
        yDisp = e.getPoint().y - label.getLocation().y;
        label.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        active = false;
        JLabel label = (JLabel) e.getComponent();
        label.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (active) {
            JLabel label = (JLabel) e.getComponent();
            Point point = e.getPoint();
            label.setLocation(point.x - xDisp, point.y - yDisp);
            label.invalidate();
            label.repaint();
        }
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }
}}
我想做的是在JPanel中添加另一个可移动图像

在哪里?我没有看到任何代码

只能向配电盘添加一个标签。如果要拖动多个标签,则需要向面板添加多个标签

该程序一次只能查看一个图像并将其拖动到周围

也许你需要一个像
addImage(Image-Image,intx,inty)
这样的方法。然后,当您调用此方法时,您可以:

  • 使用图标的图像创建JLabel
  • 使用x/y和图像大小设置标签的边界
  • 将侦听器添加到标签
  • 将标签添加到面板中
  • 我想做的是在JPanel中添加另一个可移动图像

    在哪里?我没有看到任何代码

    只能向配电盘添加一个标签。如果要拖动多个标签,则需要向面板添加多个标签

    该程序一次只能查看一个图像并将其拖动到周围

    也许你需要一个像
    addImage(Image-Image,intx,inty)
    这样的方法。然后,当您调用此方法时,您可以:

  • 使用图标的图像创建JLabel
  • 使用x/y和图像大小设置标签的边界
  • 将侦听器添加到标签
  • 将标签添加到面板中

  • 与其使用JLabel保存图像,不如从JPanel创建一个绘图面板,并直接在绘图面板上绘制图像。这里有一个例子,来自一个叫“Dennis Borgström”的人,我看这里没有问题。为什么不添加另一个标签并添加鼠标手柄呢?你试过了吗?不要将
    MouseListener
    添加到标签中,而是将它们添加到标签的容器中,然后你需要确定
    MouseEvent
    是否发生在给定的组件上,但解决方案的可伸缩性要高得多将MouseListener添加到标签中(就像你目前正在做的那样)然后,您不需要编写自己的代码来确定鼠标单击了哪个组件。这样,您只需将侦听器添加到要拖动的组件中。您还可以创建一个可重用类来执行类似的操作,这样您就不必每次都要编写自定义代码。例如,查看中的
    ComponentMover
    示例。也可以使用基本的拖动类,而不是使用JLabel保存图像,从JPanel创建一个绘图面板,并直接在绘图面板上绘制图像。这里有一个例子,来自一个叫“Dennis Borgström”的人,我看这里没有问题。为什么不添加另一个标签并添加鼠标手柄呢?你试过了吗?不要将
    MouseListener
    添加到标签中,而是将它们添加到标签的容器中,然后你需要确定
    MouseEvent
    是否发生在给定的组件上,但解决方案的可伸缩性要高得多将MouseListener添加到标签中(就像你目前正在做的那样)然后,您不需要编写自己的代码来确定鼠标单击了哪个组件。这样,您只需将侦听器添加到要拖动的组件中。您还可以创建一个可重用类来执行类似的操作,这样您就不必每次都要编写自定义代码。例如,查看中的
    ComponentMover
    示例。或者您可以只使用基本的拖动类。