在JPanel中拖动JComponent

时间:2013-12-18 11:31:03

标签: java swing jpanel draggable jcomponent

我有一个JPanel的子类,它包含一个JComponent对象数组。然后,我使用paint(Graphics g)方法将JComponent对象放在面板中彼此相邻的位置。所有这些JComponent对象都实现了MouseMostionListener,我使用addMouseMotionListener(this);初始化了监听器,我还有方法mouseMoved(MouseEvent m)mouseDragged(MouseEvent m)。正确绘制了所有组件,但从未调用mouseMoved(MouseEvent m)mouseDragged(MouseEvent m)。有什么想法吗?

这是我的代码: JPanel Subclass

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Image;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.util.ArrayList;

public class ExamplePanel extends JPanel
{
    ArrayList<ExampleComponent> components;

    public ExamplePanel()
    {
        components = new ArrayList<ExampleComponent>();
    }

    public void paint(Graphics g)
    {
        for(ExampleComponent c : components)
            g.drawImage(c.getImage(), 0, 30, 50, 75, null);
    }

    public void addComponent(ExampleComponent j)
    {
        components.add(j);
        repaint();
    }

    public static void main(String[] args) 
    {
        JFrame app = new JFrame("Staff Prototype");
        app.setSize(700,200);
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setResizable(false);

        ExamplePanel s = new ExamplePanel();
        app.getContentPane().add(s);
        s.addComponent(new ExampleComponent());
        app.setVisible(true);
    }
}

JComponent Subclass:

import java.awt.Image;
import javax.swing.JComponent;
import javax.swing.ImageIcon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class ExampleComponent extends JComponent implements MouseMotionListener
{
    Image image;

    public ExampleComponent()
    {
        ImageIcon icon = new ImageIcon("image.png");
        image = icon.getImage();
        addMouseMotionListener(this);
    }

    public Image getImage()
    {
        return image;
    }

    public void mouseMoved(MouseEvent m) 
    {
        System.out.println("Mouse Moved");
    }

    public void mouseDragged(MouseEvent m)
    {
        System.out.println("Mouse Dragged");
    }
}

1 个答案:

答案 0 :(得分:0)

1)像你一样添加组件是不正确的。

2)而不是使用带有图标的图像使用JLabel,您可以从“盒子”中获得很多优势。

我修复了你的代码,检查了一下:

import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.net.URL;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Example extends JPanel {
    ArrayList<ExampleComponent> components;

    public Example() {
        components = new ArrayList<ExampleComponent>();
    }


    public void addComponent(ExampleComponent j) {
        components.add(j);
        add(j);
    }

    public static void main(String[] args) {
        JFrame app = new JFrame("Staff Prototype");
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Example s = new Example();
        s.setLayout(null);
        app.getContentPane().add(s);
        s.addComponent(s.new ExampleComponent(new Rectangle(0,0,25,25)));
        s.addComponent(s.new ExampleComponent(new Rectangle(45,45,25,25)));
        app.pack();
        app.setVisible(true);
    }

    class ExampleComponent extends JPanel implements MouseMotionListener {

        public ExampleComponent(Rectangle bounds) {
            URL resource = getClass().getResource("3_disc.png");
            ImageIcon icon = new ImageIcon(resource);
            add(new JLabel(icon));
            addMouseMotionListener(this);
            setBounds(bounds);
        }

        public void mouseMoved(MouseEvent m) {
            System.out.println("Mouse Moved");
        }

        public void mouseDragged(MouseEvent m) {
            System.out.println("Mouse Dragged");
        }
    }
}