用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?

qq_29752057 2015-11-04 12:24:20
用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?就比如当鼠标在一个 “马” 上点击后不松开,鼠标移动到那里这个棋子就移动到那里,鼠标在哪里松开棋子就落到那里。如果能落就落下,不能落在鼠标松开后棋子又回到原来的地方。
...全文
318 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
alan19931103 2015-11-04
  • 打赏
  • 举报
回复
有鼠标的监听器,貌似叫mousemonitor你找找API。里面有鼠标按下和释放的方法
三仙半 2015-11-04
  • 打赏
  • 举报
回复
一个简单的实现,稍有变化,1、不用设置标识变量,2、不重写mouseMoved()方法,而是重写mouseDraged()方法。代码如下

package move_panel;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

/**
 * 测试窗体
 * @author zys59三仙半(QQ:597882752)<br>
 * 创建时间:2015年11月4日 上午8:07:50
 */
public class MainFrame extends JFrame {
	private static final long serialVersionUID = -6414188894860816472L;
	
	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public MainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(null);
		setContentPane(contentPane);
		
		Chessman man1 = new Chessman("马");
		man1.setLocation(10, 10);
		MouseAction action = new MouseAction();
		man1.addMouseListener(action);
		man1.addMouseMotionListener(action);
		add(man1);
	}
}

package move_panel;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

/**
 * 棋子
 * @author zys59三仙半(QQ:597882752)<br>
 *         创建时间:2015年11月4日 上午8:08:57
 */
public class Chessman extends JPanel {
	private static final long serialVersionUID = -5193489382746074068L;

	private int size = 30;
	private String txt;
	
	public Chessman(String txt) {
		this.txt = txt;
		setLayout(new BorderLayout());
		setSize(size+1, size+1);
	}

	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		Color c = g.getColor();
		g.setColor(new Color(255, 0, 0));
		g.drawOval(0, 0, 30, 30);
		g.setColor(c);
		g.drawString(txt, 10, 20);
	}	
}

package move_panel;

import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * 鼠标相关事件监听器类,用于移动棋子
 * @author zys59三仙半(QQ:597882752)<br>
 *         创建时间:2015年11月4日 上午8:17:31
 */
public class MouseAction extends MouseAdapter {

	private int dx;
	private int dy;

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		 dx = e.getX();
		 dy = e.getY();
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
		Chessman man = (Chessman) e.getSource();
		Point p = man.getLocation();
		 man.setLocation(p.x + (e.getX() - dx), p.y + (e.getY() - dy));
	}
}
dracularking 2015-11-04
  • 打赏
  • 举报
回复
点击之后不松开的状态可以判断 鼠标按下状态时移动的即时位置也能获得,画图并位置保持同步
三仙半 2015-11-04
  • 打赏
  • 举报
回复
写一个监听器类,继承MouseAdapter,设置一个标识变量,初始值为false,重写mousePressed()方法,记录鼠标点击位置和被点击对象的位置差,并设置标识变量为true,重写mouseReleased()方法,将标识变量设置为false,重写mouseMoved()方法,如果标识变量为true,就根据差值和当前鼠标位置,修改被点击对象的位置 将棋子设置为单独的显示对象,生成一个监听器类的实例listener,为棋子addMouseListener和addMouseMotionListener,都是定义好的listener

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧