写在前面
代码是跟随尚学堂机构高琪老师的java300集视频编写的,不是我自己写的,尊重原创。对其中使用的一些做界面的方法函数做些记录。
编程环境
eclipse + jdk1.8
加载窗口
目的:
给出软件的基本框架,比如标题,放大、缩小、关闭控件。
代码:
/**
* 初始化窗口,因为继承了JFrame,this有一些属性和方法
*/
public void launchFrame(){
this.setTitle("来源于尚学堂"); //设置标题
this.setVisible(true); //设置窗口为可见
this.setLocation(50, 50); //设置窗口在桌面的显示位置,左上角为原点
this.setSize(500, 500); //设置窗口的长和宽
//匿名内部类,点击关闭按钮时使程序也停止运行
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(0); //0表示正常结束
}
});
}
结果:
画窗口
目的:在窗口中绘制图形、图像、张贴图片。即显示实际内容。
绘制图形、图像
代码:
/**
* 在窗口中画图形图像
* 重写paint()方法时,第一句必须调用父类的paint()方法
* 即必须加super.paint(g);
*/
@Override
public void paint(Graphics g){ //自动被调用。 g相当于一只画笔
super.paint(g); //不加这句话,图形加载不出来
Color c = g.getColor(); //保存g的默认颜色
Font f = g.getFont(); //保存g的默认字体
g.setColor(Color.blue); //设置画笔颜色为blue
g.drawLine(50, 50, 200, 200); //画直线
g.setColor(Color.red); //设置画笔颜色为red
g.drawRect(50, 50, 200, 200); //画矩形
g.setColor(c); //设置为默认颜色
g.drawOval(50, 50, 200, 200); //画椭圆
g.setColor(Color.green);//设置为绿色
g.fillRect(50, 50, 40, 40); //填充一块区域,形成图像
g.setFont(new Font("宋体",Font.BOLD,20)); //设置新字体
g.drawString("想画就画", 100, 100); //画字符串
g.setColor(c); //最后设置为默认颜色
g.setFont(f); //改为默认字体
}
结果:
注意:(1)paint(Graphics g)方法第一句添加super.paint(g);
;paint(Graphics g)方法是自动调用的。(2)参数Graphics g有一些自己的属性,在代码中涉及了color和font。
张贴图片
- 首先建一个类,用于通过地址获取Image类型的图片。
import java.awt.Image;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
/**
* 用于获取Image类型的图片
* @author dxt
*
*/
public class GameUtil {
//工具类最好将构造器私有化
private GameUtil(){
}
/**
* 指定图片的路径,返回指定路径的Image 型的图片对象
* @param path
* @return
*/
public static Image getImage(String path){
BufferedImage bi = null;
try{
URL u = GameUtil.class.getClassLoader().getResource(path);
bi = ImageIO.read(u);
}catch(IOException e){
e.printStackTrace();
}
return bi;
}
}
- 然后在src文件夹下建立一个images包,用来存放图片。
- 在画窗口的类中,声明一个Image对象ball,在paint(Graphics g)中通过
g.drawImage(ball, 200, 200, null);
来将图片贴到窗口上。 - 结果如下:
使图片移动
通过不断将图片粘贴到窗口的不同位置,就实现了图片移动功能。即两个重点:不断粘贴和位置改变。对于位置改变,每次粘贴图片,都有一个粘贴位置,只要在每次粘贴完成后,改变粘贴位置,那么下次粘贴的图片就会改变位置;对于不断粘贴,我们需要建立一个线程来专门执行不断粘贴图片的操作。
代码:
在粘贴图片方法中改变位置
private int planeX = 250;
private int planeY = 250;
@Override
public void paint(Graphics g){
super.paint(g);
g.drawImage(bg, 0, 0, null);
g.drawImage(plane, planeX, planeY, null);
//位置改变
planeX++;
}
建立线程处理粘贴事件:
/**
* 内部类: 可直接使用外部的属性
* 帮助我们反复的重画窗口
* @author dxt
*
*/
class PaintThread extends Thread{
@Override
public void run(){
while(true){
//通过打印repeat来测试是否是不断被调用的
System.out.println("repeat");
repaint(); //paint()是系统调用的,程序员只能调用repaint()重画
//每40毫秒,画一次
try{
Thread.sleep(40);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
在launchFrame
方法中建立PaintThread线程,使线程启动。
//线程的开端
new PaintThread().run();