【问题标题】:Add Multiple Draggable Images to a JFrame将多个可拖动图像添加到 JFrame
【发布时间】:2015-11-25 06:43:45
【问题描述】:

以下代码有效并创建了一个可拖动图像 (DI)。我创建了 DI 类型的 2 个实例,test 和 test1。任何一个都可以,但我不知道如何将两者同时包含在 JFrame 中。当我尝试同时添加两者时,我只会添加最后一个。

我在这里做了很多阅读,我知道我需要创建一个 Jpanel 并将每个图像添加到 Jpanel 然后添加到 JFrame,但在这种情况下,DI 是 JPanel。

我希望这里的人可以提供帮助,我已经经历了很多试验和错误以及大量的互联网搜索,但我还没有接近答案。

这是代码 -->

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;

public class DI extends JPanel
{
    private BufferedImage image;
    Rectangle r;

    public DI(BufferedImage image) {
        super();
        this.image = image;
        r = new Rectangle(10, 10, image.getWidth(), image.getHeight());
        this.setFocusable(true);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        g2.drawImage(image, r.x, r.y, this);

        //Add a border, red if picture currently has focus
        if (isFocusOwner()) {
            g.setColor(Color.RED);
        } else {
            g.setColor(Color.BLACK);
        }
        g2.draw(r);
    }

    public void setRect(int x, int y) {
        r.x = x;
        r.y = y;
        repaint();
    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
        r.setSize(image.getWidth(), image.getHeight());
    }

    public static void main(String[] args) throws IOException {
        File file = new File("happy.png");
        BufferedImage image = ImageIO.read(file);
        DI test = new DI(image);
        DragHandler handler = new DragHandler(test);
        test.addMouseListener(handler);
        test.addMouseMotionListener(handler);

        File file2 = new File("sad.png");
        BufferedImage image2 = ImageIO.read(file2);
        DI test2 = new DI(image2);
        DragHandler handler2 = new DragHandler(test2);
        test2.addMouseListener(handler2);
        test2.addMouseMotionListener(handler2);

        JFrame f = new JFrame("This is a Draggable Icon");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(test);
        f.setContentPane(test2);
        f.setSize(400,400);
        f.setLocation(200,200);
        f.setVisible(true);
    }
}

class DragHandler extends MouseInputAdapter {
    DI di;
    Point offset;
    boolean dragging;

    public DragHandler(DI di) {
        this.di = di;
        offset = new Point();
        dragging = false;
    }

    public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        if(di.r.contains(p)) {
            offset.x = p.x - di.r.x;
            offset.y = p.y - di.r.y;
            dragging = true;
        }
    }

    public void mouseReleased(MouseEvent e) {
        dragging = false;
    }

    public void mouseDragged(MouseEvent e) {
        if(dragging) {
            int x = e.getX() - offset.x;
            int y = e.getY() - offset.y;
            di.setRect(x, y);
        }
    }
}

【问题讨论】:

  • 你的DI 应该可以处理多张图片

标签: java swing drag-and-drop draggable


【解决方案1】:

当您调用setContentPane 方法时,整个框架将被您提供的容器填充。当您执行两次时,第一个面板 (test) 将替换为第二个面板 (test2)。

f.setContentPane(test);
f.setContentPane(test2);

当您使用现有的内容窗格并指定布局管理器时,您可以使两个面板同时可见。您可以为面板设置大小甚至背景颜色(这些背景颜色对于查看面板覆盖的区域很有用):

f.getContentPane().setLayout(new FlowLayout());
f.getContentPane().add(test);
f.getContentPane().add(test2);
test.setPreferredSize(new Dimension(200, 160));
test2.setPreferredSize(new Dimension(200, 160));
test.setBackground(Color.BLUE);
test2.setBackground(Color.RED);

【讨论】:

    【解决方案2】:

    你的基本概念是错误的。您正在尝试创建一个大型组件,然后在组件边界内的某处绘制图像。问题是您不能将多个组件堆叠在一起。

    相反,您只想拥有一个简单的面板,然后向该面板添加组件。然后使用 setLocation() 方法移动组件。所以不需要定制绘画。拖动代码所做的只是更改组件的位置。当您这样做时,面板需要使用“空布局”,因此还需要负责设置您添加到面板的组件的大小。

    要显示图像,您只需使用带有 ImageIcon 的 JLabel 并将图像添加到面板。

    代码的基本结构是:

    JLabel image1 = new JLabel( new ImageIcon(...) );
    image1.setSize( image1.getPreferredSize() );
    image1.addMouseListener(...);
    image1.addMouseMotionListener(...);
    
    JPanel dragPanel = new JPanel();
    dragPanel.setLayout(null);
    dragPanel.add( image1 );
    
    frame.add(dragPanel, BorderLayout.CENTER);
    

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 2011-09-13
      • 2013-12-12
      相关资源
      最近更新 更多