我试图做一个小程序,我可以简单地拖拽图像。我想图像对象监听事件。因此,这里的小应用程序代码,在一个线程简单运行:

import java.awt.*;
import java.net.URL;
import javax.swing.JApplet;

public class Client extends JApplet implements Runnable {
    private static final long serialVersionUID = 1L;
    MediaTracker mediaTracker;
    Image [] imgArray;
    Tas t1;

    public void init() 
    { 
        mediaTracker = new MediaTracker(this);
        imgArray = new Image[1];

        URL base = getCodeBase(); 
        imgArray[0] = getImage(base,"okey.png");
        mediaTracker.addImage(imgArray[0],1);

        try {
            mediaTracker.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t1 = new Tas(this, new Rectangle(0, 0, imgArray[0].getWidth(this), imgArray[0].getHeight(this)), imgArray[0]);

        Thread t = new Thread(this);
        t.start();
    }

    public void paint(Graphics g) 
    {
        t1.paint(g);
    }

    @Override
    public void run() {
        while(true){
            //System.out.println("run");
            repaint();
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

和类对象的保持图像是:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Movable extends JPanel implements MouseListener {

public Client mainObj;
public Rectangle rect;
public Image image;

public Movable(Client mainObj, Rectangle rect, Image image) {
    this.mainObj = mainObj;
    this.rect = rect;
    this.image = image;
    addMouseListener(this);
}

public void paint(Graphics g) {
    g.drawImage(image, rect.x, rect.y, rect.width, rect.height, this);
}

@Override
public void mouseClicked(MouseEvent arg0) {
    System.out.println("clicked");
}

@Override
public void mouseEntered(MouseEvent arg0) {

}

@Override
public void mouseExited(MouseEvent arg0) {

}

@Override
public void mousePressed(MouseEvent arg0) {
    System.out.println("pressed");
}

@Override
public void mouseReleased(MouseEvent arg0) {

}
}

@SuppressWarnings("serial")
class Tas extends Movable{
    public String name = "";

    public Tas(Client mainObj, Rectangle rect, Image image) {
        super(mainObj, rect, image);
    }


}

我可以看到在我的小程序中的图像,但是当我在或缩小图像的点击没有反应。那么,有什么不对的代码。

有帮助吗?

解决方案

假设在泰斯码#1是在代码#2 ...

可移动

您不实际使用可移动的部件,而是要求它本身绘制到applet的图形上下文,此处:

public void paint(Graphics g) 
{
    t1.paint(g);
}

相反,你应该添加可移动的实例拖到小程序的容器,其中绘画将成为自动的,它会开始接收鼠标事件。也可以删除该涂料()方法,然后过

其他提示

首先你不应该覆盖顶层容器(JApplet的,JFrame中,的JDialog)的涂料方法。

然后做其他Swing组件定制画你覆盖部件,NOT涂料()方法的的paintComponent()方法。阅读关于风俗画 Swing的教程。因此,首先解决这些问题。

我不知道是什么的线程点,但是从你的代码中删除它,直到你解决其他问题。如果你正在尝试做动画,那么你就应该使用摇摆定时器,而不是一个线程。

如果你想看到将组件拖动一些代码,你可以看看的移动窗口获得一些通用代码。

这是一个可行的解决方案。这不是一个小程序,但你可以很容易地转换这一点。希望它有助于:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ImagePanel extends JPanel {

    Image image;
    Point2D axis = new Point2D.Double();
    boolean drag = false;
    Point2D dragPoint = new Point2D.Double();

    public ImagePanel(Image image) {
        this.image = image;
        setPreferredSize(new Dimension(300,300));
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                drag = true;
                dragPoint = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                drag = false;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (drag) {
                    axis.setLocation(axis.getX()
                            + (e.getPoint().x - dragPoint.getX()), axis.getY()
                            + (e.getPoint().y - dragPoint.getY()));
                    dragPoint = e.getPoint();
                    repaint();
                }
            }
        });
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(image, (int) axis.getX(), (int) axis.getY(), null);
    }

    public static void main(String[] args) {
        try {
            JFrame f = new JFrame();
            f.getContentPane().add(
                    new ImagePanel(ImageIO.read(new File("image.jpg"))));
            f.pack();
            f.setVisible(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

答案很简单 - 你不必在代码的mousePressed()或的mouseReleased()做任何事情。

有很多其他的问题,在代码虽然...

最简单的解决方案,我能想出 -

public class Client extends JApplet {

private MouseInputAdapter myMouseListener = new MyMouseListener();

public void init() {
    // usually a very bad idea, but needed here 
    // since you want to move things around manually
    setLayout(null);

    // assuming this will get used often, so making it a method.
    addLabelForImage(getImage(getCodeBase(), "okay.png"));
}

private void addLabelForImage(Image image) {
    ImageIcon icon = new ImageIcon(image);
    JLabel l = new JLabel(icon);
    add(l);
    l.setSize(l.getPreferredSize());
    // you'll probably want some way to calculate initial position 
    // of each label based on number of images, size of images, 
    // size of applet, etc. - just defaulting to 100,100 now.
    l.setLocation(100, 100);
    l.addMouseListener(myMouseListener);
    l.addMouseMotionListener(myMouseListener);
}

// Made this a MouseInputAdapter because I assume you may want to handle
// other types of mouse events later...
private static class MyMouseListener extends MouseInputAdapter {
    @Override
    public void mouseDragged(MouseEvent e) {
        // when the mouse is dragged over a the component this listener is
        // attached to (ie - one of the labels) convert the point of the mouse
        // event from the internal component coordinates (0,0 is upper right 
        // corner of each label), to it's parent's coordinates (0,0 is upper
        // right corner of the applet), and set the components location to 
        // that point.
        Component theLabel = e.getComponent();
        Container theApplet = theLabel.getParent();
        Point labelPoint = e.getPoint();
        Point appletPoint = SwingUtilities.convertPoint(
                theLabel, labelPoint, theApplet );
        theLabel.setLocation(appletPoint);
    }
}

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top