java 移动矩形为什么只能往右下角拖拽 本帖最后由 tesonic 于 2009-09-08 11:26:54 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只能往右下移动可能是因为你的方块坐标始终在加一个正数1 鼠标左键按住的时候,获取鼠标坐标(mx0, my0)2 鼠标左键按住的时候,获取方块原点坐标(rx0, ry0)3 拖拽时即时获得鼠标当前坐标(mx1, my1)4 拖拽时用鼠标即时坐标减去原始坐标获得差值(offsetX = mx1 - mx0, offsetY = my1 - my0)5 方块原点坐标加上鼠标坐标差值(rx0 + offsetX, ry0 + offsetY)鼠标移动事件可以使用 MouseMotionAdapter.mouseDragged(MouseEvent e), 判断鼠标是否在方块内可以用MouseAdapter.mouseEntered(MouseEvent e)和MouseAdapter.mouseExited(MouseEvent e) 使用MouseAdapter.mouseEntered的前提是你的方块是一个独立Object,在这个类里定义鼠标进入和离开事件 你问的是j2se还是j2ee的?swing还是js? 不好意思,我得问的详细一点儿哈首先,在mouseDragged这个方法里,我怎么去确认鼠标点击的点呢?(mouseEvent)e.getPoint()取得的是我移动时的任意一点吧。还有,我拖动这个矩形,是不是还需要重新画矩形呢,用draw的这个方法repaint()呢? 如果是我的话,我会建立一个方块的class,继承JComponent,在里面的paintComponent(Graphics)方法里绘制这个方块,这样你就不用在拖拽鼠标的时候还要顾及绘画方块。把这个方块放到一个继承JPanel的类里。在JPanel里用MouseAdaptermousePressed(MouseEvent e)的e.getX()和e.getY()来得到鼠标坐标。这个坐标应该是鼠标和JPanel原点的相对坐标(还可以得到鼠标和屏幕原点的绝对坐标)。得到鼠标坐标后再得到方块相对于JPanel的坐标。在MoseMotionAdapter.mouseDragged(MouseEvent e)里再用e.getX()和e.getY()的时候,是即时的得到鼠标拖拽过程中的坐标,你需要用来减去刚才获得的那个鼠标初始坐标来获得差值,从而改变方块坐标达到移动的目的。在mouseDragged这个方法里,最后一行应该是JPanel.repain() 说那么多,还是上代码吧MyPanel.javaimport java.awt.Point;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;public class MyPanel extends JPanel{ MySquare ms = new MySquare(); Die die = new Die(); private int oX = 0; //每次鼠标按下的时候得到鼠标的初始坐标 private int oY = 0; //每次鼠标按下的时候得到鼠标的初始坐标 private int xx = 0; //每次鼠标按下的时候得到方块的初始坐标 private int yy = 0; //每次鼠标按下的时候得到方块的初始坐标 /** test **/ public static void main(String args[]) { try{ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 800, 600); MyPanel panel = new MyPanel(); frame.add(panel); frame.setVisible(true); } catch(Exception ex) { ex.printStackTrace(); } } public MyPanel() { try{ initComp(); } catch(Exception ex) { ex.printStackTrace(); } } public void initComp() throws Exception { this.setBorder(BorderFactory.createBevelBorder(1)); //在方块上添加事件监听 ms.addMouseListener(new square_mouseAdapter(this)); ms.addMouseMotionListener(new square_mouseMotionAdapter(this)); this.add(ms); } /*** Action Handler ***/ public void square_mousePressed(MouseEvent e) { //得到左键按下的时候鼠标所在位置 int x= e.getX(); int y = e.getY(); Point p = new Point(x, y); //转化成相对屏幕的坐标 SwingUtilities.convertPointToScreen(p, ms); System.out.println("Original coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]"); //每次鼠标按下的时候得到鼠标的初始坐标 oX = (int)p.getX(); oY = (int)p.getY(); //每次鼠标按下的时候得到方块的初始坐标 xx = ms.getX(); yy = ms.getY(); System.out.println("Square original position: [" + xx + ", " + yy + "]"); } public void square_mouseDragged(MouseEvent e) { //拖拽过程中鼠标坐标 int x= e.getX(); int y = e.getY(); Point p = new Point(x, y); //转化成相对屏幕的坐标 SwingUtilities.convertPointToScreen(p, ms); System.out.println("Dragging coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]"); //获取目前鼠标位置和初始位置的差 int offsetX = (int)p.getX() - oX; int offsetY = (int)p.getY() - oY; System.out.println("Offset: [" + offsetX + ", " + offsetY + "]"); //改变方块坐标 ms.setBounds(xx + offsetX, yy + offsetY, ms.getWidth(), ms.getHeight()); this.repaint(); }}/* * 鼠标事件 */class square_mouseAdapter extends MouseAdapter { MyPanel adaptee; public square_mouseAdapter(MyPanel adaptee) { this.adaptee = adaptee; } public void mousePressed(MouseEvent e) { adaptee.square_mousePressed(e); }}class square_mouseMotionAdapter extends MouseMotionAdapter{ MyPanel adaptee; public square_mouseMotionAdapter(MyPanel adaptee) { this.adaptee = adaptee; } public void mouseDragged(MouseEvent e) { adaptee.square_mouseDragged(e); }}MySquare.javaimport java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import javax.swing.JPanel;// 方块public class MySquare extends JPanel{ public MySquare() { this.setPreferredSize(new Dimension(70, 70)); } /** * 画方块 */ @Override public void paintComponent(Graphics g) { int w = getWidth(); int h = getHeight(); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.GREEN); g2.fillRect(0, 0, w, h); g2.setColor(Color.BLACK); g2.drawRect(0, 0, w-1, h-1); }} 大家快来看呀,这是什么意思呀! 问一个关于性能的问题 Struts的配置不正确问题 请问在哪里能下载到Orbacus? javamail发送邮件到163可以,但发到tom被当作垃圾邮件拦截了,怎么办? 关于XFire的ws-security 请问一个关于一个表和其他三个表同时保存的问题。 jbuilder下面怎样调试tomcat数据库连接池啊? 我用jbuilder写了一个简单的SESSION(helloworld),结果报RMIC停止错误,为什么? EJB的客户端一般怎么开发?? ibatis + Dwr 报不能序列化持久类的异常 接收邮件
2 鼠标左键按住的时候,获取方块原点坐标(rx0, ry0)
3 拖拽时即时获得鼠标当前坐标(mx1, my1)
4 拖拽时用鼠标即时坐标减去原始坐标获得差值(offsetX = mx1 - mx0, offsetY = my1 - my0)
5 方块原点坐标加上鼠标坐标差值(rx0 + offsetX, ry0 + offsetY)鼠标移动事件可以使用 MouseMotionAdapter.mouseDragged(MouseEvent e), 判断鼠标是否在方块内可以用MouseAdapter.mouseEntered(MouseEvent e)和MouseAdapter.mouseExited(MouseEvent e)
首先,在mouseDragged这个方法里,我怎么去确认鼠标点击的点呢?(mouseEvent)e.getPoint()取得的是我移动时的任意一点吧。
还有,我拖动这个矩形,是不是还需要重新画矩形呢,用draw的这个方法repaint()呢?
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;public class MyPanel extends JPanel{
MySquare ms = new MySquare();
Die die = new Die();
private int oX = 0; //每次鼠标按下的时候得到鼠标的初始坐标
private int oY = 0; //每次鼠标按下的时候得到鼠标的初始坐标
private int xx = 0; //每次鼠标按下的时候得到方块的初始坐标
private int yy = 0; //每次鼠标按下的时候得到方块的初始坐标
/** test **/
public static void main(String args[]) {
try{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10, 10, 800, 600);
MyPanel panel = new MyPanel();
frame.add(panel);
frame.setVisible(true);
} catch(Exception ex) {
ex.printStackTrace();
}
} public MyPanel() {
try{
initComp();
} catch(Exception ex) {
ex.printStackTrace();
}
}
public void initComp() throws Exception {
this.setBorder(BorderFactory.createBevelBorder(1));
//在方块上添加事件监听
ms.addMouseListener(new square_mouseAdapter(this));
ms.addMouseMotionListener(new square_mouseMotionAdapter(this));
this.add(ms);
}
/*** Action Handler ***/
public void square_mousePressed(MouseEvent e) {
//得到左键按下的时候鼠标所在位置
int x= e.getX();
int y = e.getY();
Point p = new Point(x, y);
//转化成相对屏幕的坐标
SwingUtilities.convertPointToScreen(p, ms);
System.out.println("Original coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]");
//每次鼠标按下的时候得到鼠标的初始坐标
oX = (int)p.getX();
oY = (int)p.getY();
//每次鼠标按下的时候得到方块的初始坐标
xx = ms.getX();
yy = ms.getY();
System.out.println("Square original position: [" + xx + ", " + yy + "]");
}
public void square_mouseDragged(MouseEvent e) {
//拖拽过程中鼠标坐标
int x= e.getX();
int y = e.getY();
Point p = new Point(x, y);
//转化成相对屏幕的坐标
SwingUtilities.convertPointToScreen(p, ms);
System.out.println("Dragging coordinates: [" + x + ", " + y + "]\tAfter conversion:[" + p.getX() + ", " + p.getY() + "]");
//获取目前鼠标位置和初始位置的差
int offsetX = (int)p.getX() - oX;
int offsetY = (int)p.getY() - oY;
System.out.println("Offset: [" + offsetX + ", " + offsetY + "]");
//改变方块坐标
ms.setBounds(xx + offsetX, yy + offsetY, ms.getWidth(), ms.getHeight());
this.repaint();
}
}/*
* 鼠标事件
*/
class square_mouseAdapter extends MouseAdapter {
MyPanel adaptee;
public square_mouseAdapter(MyPanel adaptee) {
this.adaptee = adaptee;
}
public void mousePressed(MouseEvent e) {
adaptee.square_mousePressed(e);
}
}class square_mouseMotionAdapter extends MouseMotionAdapter{
MyPanel adaptee;
public square_mouseMotionAdapter(MyPanel adaptee) {
this.adaptee = adaptee;
}
public void mouseDragged(MouseEvent e) {
adaptee.square_mouseDragged(e);
}
}
MySquare.javaimport java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;import javax.swing.JPanel;// 方块
public class MySquare extends JPanel{
public MySquare() {
this.setPreferredSize(new Dimension(70, 70));
}
/**
* 画方块
*/
@Override
public void paintComponent(Graphics g) {
int w = getWidth();
int h = getHeight();
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.GREEN);
g2.fillRect(0, 0, w, h);
g2.setColor(Color.BLACK);
g2.drawRect(0, 0, w-1, h-1);
}
}