1

如何在 Java2D 中鼠标拖动不同的 BufferedImages?

例如,如果我有十个或更多图像,我如何移动鼠标所在的图像?

现在我正在导入一个 BufferedImage

BufferedImage img = new BufferdImage(new File("filename"));

我正在用 Graphics2D 画这个

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    g2d.drawImage(img, x1, y1, null);
    g2d.drawImage(img2, x2, y2,null);
}

每次我在图像上移动时,我都会重新绘制()整个屏幕。我的 mousemove 类如下

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        x1 = e.getX() - (img.getWidth() / 2);
        y1 = e.getY() - (img.getHeight() / 2);
        repaint();
    }
}

使用这种方法,我可以“拖动”一张图片,但是当我要单独拖动更多时该怎么办?

4

6 回答 6

2

使用 BufferedImage 创建一个用于创建 JLabel 的 ImageIcon。然后将 JLabel 添加到使用空布局的面板中。无需自定义绘画代码即可执行此操作。

现在,如果您想拖动标签,可以使用Component Mover

于 2010-04-09T15:19:37.647 回答
1

您可以尝试制作仅包含单个图像的自定义组件。连同您的绘画和鼠标运动处理代码,该组件将覆盖 contains 方法,以便仅当坐标在图像内时它才返回 true。

然后将这些组件堆叠在 JLayeredPane 中,(希望)仅移动鼠标位于其上的图像。

于 2010-04-09T10:44:13.633 回答
0

我应该制作树数组:

  1. 一个用于 x 值
  2. 一个用于 y 值
  3. 一个用于 BufferedImages

所以,像这样:

int[] xValues = new int[10];
int[] yValues = new int[10];
BufferedImage[] imgs = new BufferedImage[10];

然后

class MouseMotionHandler extends MouseMotionAdapter {

    @Override
    public void mouseDragged(MouseEvent e) {
        for (int i = 0; i < 10; i++)
        {
            xValues[i] = e.getX() - (imgs[i].getWidth() / 2);
            yValues[i] = e.getY() - (imgs[i].getHeight() / 2);
        }
        repaint();
    }
}

然后像这样画它们:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    for (int i = 0; i < 10; i++)
    {
        g2d.drawImage(imgs[i], xValues[i], yValues[i], null);
    }
}

我认为这样的东西是你需要的。

于 2010-04-09T11:46:44.653 回答
0

这是我的 JLayeredPane 初始化的代码。我的问题是我的图像不显示...

layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new java.awt.Dimension(500, 410));
layeredPane.setBorder(javax.swing.BorderFactory.createTitledBorder(
                                "Center deck"));
for(BufferedImage imgs : images){
   JLabel label = new JLabel(new ImageIcon(imgs));
   layeredPane.add(label, JLayeredPane.DEFAULT_LAYER);
}
add(layeredPane);
于 2010-04-14T11:33:14.417 回答
0

根据您的要求,我认为您当前的重绘逻辑是全球性的。您需要将其应用于您拥有的每张图像。因此,例如,如果您将每个图像JPanel附加MouseMotionListener到每个这样的面板并让这个逻辑发生在JPanel.

如果您发布更多代码 - 特别是您显示图像的组件 - 我将能够进入更多细节。

于 2010-04-09T10:39:18.957 回答
0

这是一个简单的示例,它实现了单选或多选的拖动。该对象Node将大致对应于您的对象Card

附录:还考虑了相关问题的答案中提到的重叠布局。而不是,您的程序将管理一个,其中每个都有一张卡片图像。List<Node>List<Card>CardJLabel

于 2010-04-09T10:43:10.967 回答