在Java2D中移动多个BufferedImage?

时间:2010-04-09 10:27:10

标签: java mouseevent bufferedimage java-2d

如何在Java2D中mousedrag不同的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();
    }
}

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

6 个答案:

答案 0 :(得分:2)

使用BufferedImage创建用于创建JLabel的ImageIcon。然后将JLabel添加到使用空布局的面板。这样做不需要自定义绘画代码。

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

答案 1 :(得分:1)

您可以尝试制作仅包含单个图像的自定义组件。除了绘画和鼠标运动处理代码外,该组件还会覆盖contains方法,以便仅当坐标位于图像中时才返回true。

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

答案 2 :(得分:0)

根据你的要求,我认为你当前的重画逻辑是全球性的。您需要将它应用于您拥有的每个图像。因此,如果您将JPanel附加MouseMotionListener中的每个图片显示到每个此类面板,并在JPanel中进行此逻辑。

如果您发布更多代码 - 尤其是您展示图片的组件 - 我将能够详细介绍。

答案 3 :(得分:0)

这是一个简单的example,可以实现单次或多次选择的拖动。对象Node将大致对应于您的对象Card

附录:还考虑了Overlap Layout中提到的answer相关问题。您的计划将管理List<Node>,而不是List<Card>,其中每个Card都是JLabel,其中包含卡片图片。

答案 4 :(得分:0)

我应该制作树阵列:

  1. 一个用于x值
  2. 一个用于y值
  3. 一个用于BufferedImages
  4. 所以,像这样:

    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);
        }
    }
    

    我认为这就是你所需要的。

答案 5 :(得分:0)

这是我的JLayeredPane init的代码。我的问题是我的图像没有出现......

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);