我自己写了一个类,有x,y坐标位置属性,还有image属性,在窗体创建它的一个实例,加载一张图片到它的image属性中,然后每次repaint时取出它的image进行drawImage()方法,这样就可以显示那张图片.
现在我想用鼠标拖动它,当然在mouseDragged方法里可以对那个实例的x,y属性进行控制,然后repaint时读取x,y的属性进行有位置的重绘就可以实现鼠标移动去控制图像的移动了,我现在想再创建多个实例,加载多张图片,然后鼠标对每一个图片进行拖动,这时候问题就出现了,因为我写的那个类没有实现或继承任何其它的类,就不能在窗体使用addMouseMotionListener()方法去注册监听器,然后对每一个实例进行控制,(比如说Label就可以,创建多个Label然后都注册addMouseMotionListener监听方法,在拖动某一个Label时就调用setLocation方法对位置进行控制).
想问一下各位我能用什么方法做到?
多谢

解决方案 »

  1.   

    步骤如下:
    1. 使用java.awt.event.ActionListener。
    2.注册监听器以监听事件源产生的事件(通过ActionListener来响应用户点击按钮)。
    3.定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。 
    示例代码如下:
    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; public class Sample 

        private static JFrame frame;   // 定义为静态变量以便main使用 
        private static JPanel myPanel; // 该面板用来放置按钮组件 
        private JButton button1;       // 这里定义按钮组件     
        private JButton button2;       // 以便让ActionListener使用 
             
        // 利用一般内部类来监听每一个事件源产生的事件如(button1, button2) 
        private class Button1Handler implements ActionListener 
        { 
            public void actionPerformed(ActionEvent e) 
            { 
                JOptionPane.showMessageDialog(frame, 
                                             "按钮1 被点击"); 
            } 
        } 
         
        private class Button2Handler implements ActionListener 
        { 
            public void actionPerformed(ActionEvent e) 
            { 
                JOptionPane.showMessageDialog(frame, 
                                             "按钮2 被点击"); 
            } 
        } 
         
        public Sample()                //  构造器, 建立图形界面 
        { 
             // 新建面板 
            myPanel = new JPanel(); 
            // 新建按钮 
            button1 = new JButton("按钮1");  // 新建按钮1 
            button2 = new JButton("按钮2");         // 对每一个组件注册监听内部类 
            button1.addActionListener(new Button1Handler()); 
            button2.addActionListener(new Button2Handler());         myPanel.add(button1);        // 添加按钮到面板 
            myPanel.add(button2); 
        }     public static void main(String s[]) 
        { 
            Sample gui = new Sample();  // 新建Simple3组件         frame = new JFrame("Simple Test");
            // 处理关闭事件的通常方法         
            frame.addWindowListener(new WindowAdapter() { 
                 public void windowClosing(WindowEvent e) 
                  {System.exit(0);} });         frame.getContentPane().add(myPanel); 
            frame.pack();                    
            frame.setVisible(true); 
        } 
    }
      

  2.   

    楼上没有看懂我的意思呀!
    那个我当然知道,还用Label标签实现了.
    我要的是对Image增加监听!我自己写了个类,里面有属性Image,产生它的实例后取得它Image属性进行drawImage,那个类不继承Component的,怎么可以加addMouseMotionListener呢?
    所以我到这里来问你们了,看有没有什么办法,不要问我为什么不用Label现成的类做那个,因为那样的话以后的步骤局限性很大.
    不多还是多谢你关注.
      

  3.   

    ImageEntity源码:
    package csdn;
    import java.applet.Applet;
    import java.awt.Image;
    import java.awt.Rectangle;
    import java.awt.Toolkit;
    import java.net.URL;
    public class ImageEntity {
    private int x;
    private int y;
    private Image image;
    private Applet applet;
    public ImageEntity(Applet applet){
    setImage(null);
    this.applet = applet;
    }
    private URL getURL(String filename) {
            URL url = null;
            try {
                url = this.getClass().getResource(filename);
            }
            catch (Exception e) { }
            return url;
        }
        public void load(String filename) {
            Toolkit tk = Toolkit.getDefaultToolkit();
            image = tk.getImage(getURL(filename));
        }
        public Rectangle getBounds() {
            Rectangle r;
            r = new Rectangle((int)getX(), (int)getY(), image.getWidth(applet), image.getHeight(applet));
            return r;
        }
    public int getX() {
    return x;
    }
    public void setX(int x) {
    this.x = x;
    }
    public int getY() {
    return y;
    }
    public void setY(int y) {
    this.y = y;
    }
    public Image getImage() {
    return image;
    }
    public void setImage(Image image) {
    this.image = image;
    }
    public Applet getApplet() {
    return applet;
    }
    public void setApplet(Applet applet) {
    this.applet = applet;
    }
    }
    RealPhoto源码:
    package csdn;
    import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    public class RealPhoto extends Applet implements MouseMotionListener, MouseListener {
    BufferedImage backbuffer;
        Graphics2D g2d;
        AffineTransform identity = new AffineTransform();
        ImageEntity[] photo = new ImageEntity[4];
        boolean leftMouseButton;
        int mouseX,mouseY;
    public void init(){
    backbuffer = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
            g2d = backbuffer.createGraphics();
            for(int i=0;i<4;i++){
            photo[i] = new ImageEntity(this);
            String imageName = i+".jpg";
            photo[i].load(imageName);
            }
            this.addMouseMotionListener(this);
            this.addMouseListener(this);
    }
    public void update(Graphics g){
    g2d.setTransform(identity);
            g2d.setPaint(Color.GRAY);
            g2d.fillRect(0, 0, getSize().width, getSize().height);
    drawLine();
    drawPhoto();
            paint(g);
    }
    public void drawLine(){
    g2d.setTransform(identity);
    g2d.setColor(Color.BLUE);
    g2d.drawLine(0, 0, mouseX, mouseY);
    }
    public void drawPhoto(){
    // photo.transform();
    // photo.draw();
    if(leftMouseButton){
    //g2d.setTransform(identity);
    for(int i=0;i<4;i++){
    g2d.setTransform(identity);
    g2d.translate(photo[i].getX(), photo[i].getY());
    g2d.scale(0.3, 0.3);
    g2d.drawImage(photo[i].getImage(), identity, this);
    }
    }
    }
    public void updatePhoto(){
    for(int i=0;i<4;i++){
    if(photo[i].getBounds().contains(mouseX,mouseY)){
    photo[i].setX(mouseX-80);
    photo[i].setY(mouseY-80);
    }
    }
    }
    public void paint(Graphics g){
    g.drawImage(backbuffer, 0, 0, this);
    }
    public void start(){}
    public void run() {}
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {
    int keyCode = e.getButton();
    switch(keyCode){
    case MouseEvent.BUTTON1:
    leftMouseButton = true;
    break;
    }
    }
    public void mouseReleased(MouseEvent e) {
    int keyCode = e.getButton();
    switch(keyCode){
    case MouseEvent.BUTTON1:
    leftMouseButton = false;
    break;
    }
    }
    public void mouseDragged(MouseEvent e) {
    mouseX = e.getX();
    mouseY = e.getY();
    updatePhoto();
    repaint();
    }
    public void mouseMoved(MouseEvent e) {}
    }
    运行的话将四张图片按0.jpg,1.jpg,2.jpg,3.jpg放到csdn包下运行.
    上面实现的是mouseDragged的时候,把鼠标位置传递给ImageEntity的x,y属性以实现移动,我现在想有什么方法可以给ImageEntity增加监听器,这样就可以像Label,Button等等组件一样addMouseMotionListener了,就无需做边界判断去拖动了.
    这次该说清了吧...
      

  4.   

    支持,我想问问楼主,最后怎么解决了邮箱为[email protected],谢谢啊,改了两天的一个buge还没有搞定,有了这个就可以解决了