目录及源码链接https://blog.csdn.net/coolyuan/article/details/107169180
效果展示:
实现方法:
1.窗口添加背景图
窗口添加背景图实现方法
2.打字游戏标题的自动下落
标题的自动下落其实上也是打字游戏的精髓代码之所在,只要理解了如何实现标题下落,那么数字下落问题也可如法炮制。
实现标题自动下落的本质实际上就是将标题画在一个画布上,然后擦掉标题,修改标题位置后再次重绘,只要反复重绘的速度够快,就形成了标题在自动下落的感觉。
实现方法是新建一个JPanel的子类(为了实现重绘)并且实现runnable接口(等等为了新建一个线程,让标题下落和其他的任务可以并发执行)
class Title extends JPanel implements Runnable {
int width = 500;
int height = 250;
int N = 4;
int[] x = new int[N];//存储标题中的每个字的横坐标
int[] y = new int[N];//存储标题中的每个字的纵坐标
String[] strs = new String[]{"打", "字", "游", "戏"};
Title() {
setBounds(0, 0, width, height);//设置面板大小
setOpaque(false);//透明
setplace();//设置标题每个字初始的横纵坐标
}
void setplace() {
for (int i = 0; i < N; i++) {
x[i] = (int) (width * 0.15 + i * 0.2 * width);
y[i] = 10;
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.RED);//设置画笔颜色为红
g.setFont(new Font("方正姚体", Font.PLAIN, 50));//设置画笔字体
for (int i = 0; i < N; i++) {
g.drawString(strs[i], x[i], y[i]);//在指定位置画出标题的字
y[i]++;//标题的字纵坐标下移一像素
if (y[i] > height - 50) {//如果到达height-50,则保持在那个位置
y[i] = height - 50;
}
}
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(10);//实现每10毫秒重绘一次
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();//调用重绘函数
}
}
}
然后再主窗口添加该标题面板,并启动线程
Title title = new Title();//新建一个标题对象
this.add(title);//往窗口中加入标题面板
Thread t = new Thread(title);//将标题面板加入一个线程
t.start();//启动线程,实现标题面板下落
3.鼠标进入按钮范围内自动圈起
本人嫌弃JButton太丑,因此用JLabel代替,圈起的实现只需要给每个JLabel添加鼠标适配器,当鼠标
进入JLabel区域时,重写 mouseEntered方法,给JLabel添加边框,重写mouseExited方法,设置JLabel无边框,如:
exitjb.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.exit(0);
}
public void mouseEntered(MouseEvent e) {
exitjb.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.LIGHT_GRAY));
}
@Override
public void mouseExited(MouseEvent e) {
exitjb.setBorder(null);
}
});
ps:被老师问过 MouseAdapter()这块东西是什么,当初以为能new的应该就是个普通的类,结果打脸了。
Ctrl+鼠标左键查看MouseAdapter,
知道了MouseAdapter是个抽象类,实现了MouseListener等接口,因此可以使用MouseAdapter的子类创建的对象做监视器,只需重写需要的接口方法即可。
new MouseAdapter()实际上就是new了一个继承了MouseAdapter抽象类的匿名内部类。