使用 MouseDrag 方法拖动图像 [英] Dragging Image using MouseDrag method
问题描述
我正在尝试编写可以使用 mouseDragged 方法拖动图像的代码,但我似乎无法使用当前的代码成功地做到这一点.我的目标是确保当我在小程序中的每个图像上拖动时,它会跟随光标.
I'm trying to code where an image can be dragged using the mouseDragged method, but I can't seem to successfully do it with my current code. My aim is to ensure that when I place drag on every image in the applet, it follows the cursor.
/* Using drag mouseEvent, all objects in the app can be dragged...
*/
package finals_two;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
/* 10/16/2015
* @author michael.pabilona
*/
public class Finals_Two extends Applet implements MouseMotionListener
{
int hei, wid, xCoordinate, yCoordinate;
Image leftReceiver1, leftReceiver2, leftReceiver3;
Image rightReceiver1, rightReceiver2, rightReceiver3;
Image leftSpiker, rightSpiker, center, setter;
public void init()
{
hei = getSize().height;
wid = getSize().width;
xCoordinate = hei;
yCoordinate = wid;
addMouseMotionListener(this);
}
public void mouseDragged(MouseEvent e)
{
xCoordinate = e.getX();
yCoordinate = e.getY();
repaint();
}
public void paint(Graphics gr)
{
setBackground(Color.white);
gr.setColor(Color.black);
//court bound top line
gr.drawLine(400, 130, 1200, 130);
//court bound bottom line
gr.drawLine(200, 530, 1000, 530);
//court bound left line
gr.drawLine(400, 130, 200, 530);
//court bound right line
gr.drawLine(1000, 530, 1200, 130);
//net
gr.drawLine(800, 130, 600, 530);
gr.drawLine(800, 130, 800, 0);
gr.drawLine(600, 530, 600, 400);
//net horizontal lines
gr.drawLine(800, 0, 600, 400);
gr.drawLine(800, 10, 600, 410);
gr.drawLine(800, 20, 600, 420);
gr.drawLine(800, 30, 600, 430);
gr.drawLine(800, 40, 600, 440);
gr.drawLine(800, 50, 600, 450);
gr.drawLine(800, 60, 600, 460);
gr.drawLine(800, 70, 600, 470);
gr.drawLine(800, 80, 600, 480);
//net vertical lines
gr.drawLine(795, 5, 795, 90);
gr.drawLine(790, 20, 790, 100);
gr.drawLine(785, 30, 785, 110);
gr.drawLine(780, 40, 780, 120);
gr.drawLine(775, 50, 775, 130);
gr.drawLine(770, 60, 770, 140);
gr.drawLine(765, 70, 765, 150);
gr.drawLine(760, 80, 760, 160);
gr.drawLine(755, 90, 755, 170);
gr.drawLine(750, 100, 750, 180);
gr.drawLine(745, 110, 745, 190);
gr.drawLine(740, 120, 740, 200);
gr.drawLine(735, 130, 735, 210);
gr.drawLine(730, 140, 730, 220);
gr.drawLine(725, 150, 725, 230);
gr.drawLine(720, 160, 720, 240);
gr.drawLine(715, 170, 715, 250);
gr.drawLine(710, 180, 710, 260);
gr.drawLine(705, 190, 705, 270);
gr.drawLine(700, 200, 700, 280);
gr.drawLine(695, 210, 695, 290);
gr.drawLine(690, 220, 690, 300);
gr.drawLine(685, 230, 685, 310);
gr.drawLine(680, 240, 680, 320);
gr.drawLine(675, 250, 675, 330);
gr.drawLine(670, 260, 670, 340);
gr.drawLine(665, 270, 665, 350);
gr.drawLine(660, 280, 660, 360);
gr.drawLine(655, 290, 655, 370);
gr.drawLine(650, 300, 650, 380);
gr.drawLine(645, 310, 645, 390);
gr.drawLine(640, 320, 640, 400);
gr.drawLine(635, 330, 635, 410);
gr.drawLine(630, 340, 630, 420);
gr.drawLine(625, 350, 625, 430);
gr.drawLine(620, 360, 620, 440);
gr.drawLine(615, 370, 615, 450);
gr.drawLine(610, 380, 610, 460);
gr.drawLine(605, 390, 605, 470);
gr.drawLine(600, 390, 600, 480);
//left mid line
gr.drawLine(625, 130, 425, 530);
//right mid line
gr.drawLine(975, 130, 775, 530);
//left backend receivers
leftReceiver1 = getImage(getDocumentBase(),"receiver.jpg");
gr.drawImage(leftReceiver1, 400, 100, 90, 90, this);
leftReceiver2 = getImage(getDocumentBase(),"receiver.jpg");
gr.drawImage(leftReceiver2, 325, 250, 90, 90, this);
leftReceiver3 = getImage(getDocumentBase(),"server1.jpg");
gr.drawImage(leftReceiver3, 75, 375, 150, 150, this);
//right backend receivers
rightReceiver1 = getImage(getDocumentBase(),"receiver1.jpg");
gr.drawImage(rightReceiver1, 1000, 100, 100, 100, this);
rightReceiver2 = getImage(getDocumentBase(),"receiver1.jpg");
gr.drawImage(rightReceiver2, 950, 250, 100, 100, this);
rightReceiver3 = getImage(getDocumentBase(),"receiver1.jpg");
gr.drawImage(rightReceiver3, 900, 400, 100, 100, this);
//left front liners
leftSpiker = getImage(getDocumentBase(),"spiker.jpg");
gr.drawImage(leftSpiker, 650, 30, 100, 100, this);
center = getImage(getDocumentBase(),"spiker.jpg");
gr.drawImage(center,600,150,100,100,this);
setter = getImage(getDocumentBase(),"setter.jpg");
gr.drawImage(setter, 500, 300, 150, 150, this);
//right front liners
rightSpiker = getImage(getDocumentBase(),"spiker1.jpg");
gr.drawImage(rightSpiker,650,350,130,130,this);
center = getImage(getDocumentBase(),"server.jpg");
gr.drawImage(center,750,150,130,130,this);
setter = getImage(getDocumentBase(),"defense1.jpg");
gr.drawImage(setter,850,90,110,110,this);
}
@Override
public void mouseMoved(MouseEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
这是我当前的代码.有人可以告诉我我缺少什么或我在这里做错了什么吗?
This is my current code. Can someone direct me what I am missing or what I did wrong here?
推荐答案
为了拖动任何东西,你需要知道一些事情.您需要知道它们在哪里以及占据的空间.
In order to drag anything, you need to know a few things. You need to know where they are and the space the occupy.
一旦知道这一点,您就可以监控 mouseDragged
事件并更新它们的位置.
Once you know that, you can monitor the mouseDragged
event and update their location.
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DragMe {
public static void main(String[] args) {
new DragMe();
}
public DragMe() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Map<Image, Point> locations;
public TestPane() {
locations = new HashMap<>(25);
try {
locations.put(ImageIO.read(getClass().getResource("/Pony.png")), new Point(0, 0));
} catch (IOException ex) {
ex.printStackTrace();
}
MouseAdapter ma = new MouseAdapter() {
private Image dragImage;
private Point clickOffset;
@Override
public void mousePressed(MouseEvent e) {
for (Map.Entry<Image, Point> entry : locations.entrySet()) {
Image image = entry.getKey();
Point point = entry.getValue();
Rectangle bounds = new Rectangle(
point.x, point.y,
image.getWidth(TestPane.this), image.getHeight(TestPane.this));
if (bounds.contains(e.getPoint())) {
dragImage = image;
clickOffset = new Point(point.x - e.getPoint().x, point.y - e.getPoint().y);
break;
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
dragImage = null;
clickOffset = null;
}
@Override
public void mouseDragged(MouseEvent e) {
if (dragImage != null) {
Point dragPoint = new Point(e.getPoint());
dragPoint.x += clickOffset.x;
dragPoint.y += clickOffset.y;
locations.put(dragImage, dragPoint);
repaint();
}
}
};
addMouseListener(ma);
addMouseMotionListener(ma);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Map.Entry<Image, Point> entry : locations.entrySet()) {
Point point = entry.getValue();
g2d.drawImage(entry.getKey(), point.x, point.y, this);
}
g2d.dispose();
}
}
}
这篇关于使用 MouseDrag 方法拖动图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!