一、属性
面向对象设计:说白了,就是在JavaBean类中要定义几个属性、定义几个方法。
面向对象的设计不能自己想,一定要结合业务场景、业务需求慢慢分析,脱离业务需求去说面向对象的设计就是耍流氓。
现在我们来想一下,在斗地主游戏中,这个牌我们该怎么表示。
首先第一个属性要想到:是牌的名字,在之前我们写的控制台版本中,直接一个字符串就搞定了,但是现在,涉及到图形化界面了就要复杂一些。

在以前,这张牌的名字是 ♠A
,但是在 Windows操作系统
中,它是不允许这种奇奇怪怪的符号当做名字的。
所以要来改一改,我们会用 数字-数字
的方式进行表示,前面的数字表示花色,后面的数字就表示牌,因此 ♠A
的名字就是:1-1

可以发现每张牌的图片也是由这个来命名的
第二个属性应该是什么呢?
通过玩游戏可以发现,有的牌是正面,但有的牌是反面,因此还需要有一个属性去表示牌的正反面。
正反面由两种状态,这个属性应该是 boolean

当我在打牌的时候,需要对牌进行点击,点击完后,它应该会有一个升起的动作,但是不是所有的牌都能点。
因此还需要第三个属性,来表示牌是否可以被点击。

还没完,还有第四个属性需要考虑:我们需要来判断一下,自己的牌是否已经被点击了。
如果牌已经被弹起,再点击它,就会执行降落的操作。
因此这个牌还需要有第四个属性,用来记录当前的牌是否已经被点击。

二、方法
方法非常简单,有三个方法:
- 显示牌正面的方法
- 显示牌反面的方法
- 牌被点击后要执行的方法
这个图片是需要交给 JLabel
去管理的,因此我们先让 Poker类
继承 JLabel
,表示当前的牌其实也就是一个 JLabel
管理容器,它可以管理我们加载进来的每一张牌。
public class Poker extends JLabel implements MouseListener {
//属性
//1.牌的名字 格式:数字 - 数字
private String name;
//2.牌显示正面还是反面
private boolean up;
//3.是否可以被点击
private boolean canClick = false;
//4.当前的状态,表示当前的牌是否已经被点击
//如果是没有被点击的状态,此时被点击了,会执行弹起的操作
//如果是已经被点击的状态,此时被点击了,会执行降落的操作
private boolean clicked = false;
// 构造方法这里就不建议写空参构造了,因为每张牌必须有名字,必须有正反面,其他的属性都是有默认值的。
public Poker(String name,boolean up){
this.name = name;
this.up = up;
//判断当前的牌是显示正面还是反面
if(this.up){
//显示正面
turnFront();
}else{
//显示反面
turnRear();
}
//设置牌的宽高
this.setSize(71,96);
//把牌显示出来
this.setVisible(true);
//给每一张牌添加监听,JLabel只能添加鼠标监听,其他的监听是添加不了的
this.addMouseListener(this);
}
//显示正面
public void turnFront(){
//给牌设置正面
this.setIcon(new ImageIcon("farmerandlord\\image\\poker\\"+name+".png"));
//修改成员变量
this.up = true;
}
//显示反面
public void turnRear(){
//给牌设置反面
this.setIcon(new ImageIcon("farmerandlord\\image\\poker\\rear.png"));
//修改成员变量
this.up = false;
}
@Override
public void mouseClicked(MouseEvent e) {
//点击
//判断当前的牌是否可以被点击
if(canClick){
//当牌被点击之后,要么升起,要么降落
//表示牌的位移像素
int step = 0;
if(clicked){
//表示当前的牌已经被点击
//降落(y 增加 20像素)
step = 20;
}else{
//表示当前的牌还没有被点击
//升起 (y 减少 20像素)
step = -20;
}
//需要修改一下clicked变量记录的值
clicked = !clicked;
//修改一下牌的位置
Point from = this.getLocation(); // 获取当前牌的位置
//创建一个Point的对象,表示结束位置
Point to = new Point(from.x,from.y + step);
//把最新的位置设置给牌
this.setLocation(to);
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return up
*/
public boolean isUp() {
return up;
}
/**
* 设置
* @param up
*/
public void setUp(boolean up) {
this.up = up;
}
/**
* 获取
* @return canClick
*/
public boolean isCanClick() {
return canClick;
}
/**
* 设置
* @param canClick
*/
public void setCanClick(boolean canClick) {
this.canClick = canClick;
}
/**
* 获取
* @return clicked
*/
public boolean isClicked() {
return clicked;
}
/**
* 设置
* @param clicked
*/
public void setClicked(boolean clicked) {
this.clicked = clicked;
}
public String toString() {
return "Poker{name = " + name + ", up = " + up + ", canClick = " + canClick + ", clicked = " + clicked + "}";
}
}