用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?
用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?用java写一个象棋小游戏,怎么实现鼠标拖动棋子的效果?就比如当鼠标在一个 “马” 上点击后不松开,鼠标移动到那里这个棋子就移动到那里,鼠标在哪里松开棋子就落到那里。如果能落就落下,不能落在鼠标松开后棋子又回到原来的地方。
------解决思路----------------------
写一个监听器类,继承MouseAdapter,设置一个标识变量,初始值为false,重写mousePressed()方法,记录鼠标点击位置和被点击对象的位置差,并设置标识变量为true,重写mouseReleased()方法,将标识变量设置为false,重写mouseMoved()方法,如果标识变量为true,就根据差值和当前鼠标位置,修改被点击对象的位置
将棋子设置为单独的显示对象,生成一个监听器类的实例listener,为棋子addMouseListener和addMouseMotionListener,都是定义好的listener
------解决思路----------------------
一个简单的实现,稍有变化,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)
* 创建时间: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)
* 创建时间: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)
* 创建时间: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));
}
}