绘制窗口 + 显示颜色
- paint(Graphics g)
java绘图时,最常使用到的就是paint(Graphics g){…内容…}方法获取画笔,然后利用JPanel等容器作为画布,在JFrame内呈现出内容,很多情况下这种方式都还是很实用,
import javax.swing.*;
import java.awt.*;
public class GamePanel extends JFrame {
int width = 800;
int height = 610;
public void launch(){
setTitle("TankWar");
setSize(width,height);
setLocationRelativeTo(null); //使屏幕居中
setDefaultCloseOperation(3); //添加关闭事件
setResizable(false); //用户不能改变大小
setVisible(true); //使窗口可见
this.addKeyListener(new GamePanel.KeyMonitor()); //添加键盘监视器
}
//paint()方法
@Override
public void paint(Graphics g){
g.setColor(Color.gray);
g.fillRect(0,0,width,height); //绘制实心矩形
g.setColor(Color.blue);
g.setFont(new Font("仿宋",Font.BOLD,50));
g.drawString("选择游戏模式",220,100);
g.drawString("单人模式",220,200);
g.drawString("双人模式",220,300);
}
public static void main(String[] args) {
GamePanel gp = new GamePanel();
gp.launch();
}
}
键盘监听
基于JFrame与KeyAdapter
class KeyMonitor extends KeyAdapter{ //键盘监视器
@Override //按下键盘
public void keyPressed(KeyEvent e){
System.out.println(e.getKeyChar()); //返回键值 输出按键
}
}
- printStackTrace()
当try语句中出现异常是时,会执行catch 中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象异常名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace();。printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)
添加图片tank指针
public class GamePanel extends JFrame { //指针图片
Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
}
while(true){ //重绘
repaint();
try {
Thread.sleep(25);
}catch (Exception e){
e.printStackTrace();
}
}
paint()方法{ g.drawImage(select,160,y,null); //绘制指针}
键盘监听2
class KeyMonitor extends KeyAdapter{ //键盘监视器
@Override //按下键盘
public void keyPressed(KeyEvent e){
//返回键值
int key = e.getKeyCode();
switch (key){
case KeyEvent.VK_UP: //按键1的键值
a = 1;
y = 150;
break;
case KeyEvent.VK_DOWN:
a = 2;
y = 250;
break;
case KeyEvent.VK_ENTER:
state = a;
break;
}
// System.out.println(e.getKeyChar()); //返回键值 输出按键
}
}
public class GamePanel extends JFrame{int a = 1; //当按下回车的时候去选择开始游戏模式}
双缓存机制
定义双缓存图片(重新创建一个空的图片,把所有组件先绘制到空图片上,再把绘制好的图片一次性绘制到主窗口当中)
public class GamePanel extends JFrame{ Image offScreemImage = null; }
public void paint(Graphics g){
//创建和容器一样大小的Image图片
if(offScreemImage == null){
offScreemImage = this.createImage(width,height);
}
//获取该图片的画笔
Graphics gImage = offScreemImage.getGraphics();
}
...把元素绘制到新的图片上[g.drawString()变成gImage.drawString()]
gImage._______________________
临时代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class GamePanel extends JFrame {
int width = 800;
int height = 610;
//定义双缓存图片(重新创建一个空的图片,把所有组件先绘制到空图片上,再把绘制好的图片一次性绘制到主窗口当中)
Image offScreemImage = null;
//指针图片
Image select = Toolkit.getDefaultToolkit().getImage("images/selecttank.gif");
int y = 150; //指针初始纵坐标
int state = 0; //游戏模式 0 开始,1 单人模式,2 双人模式
int a = 1; //当按下回车的时候去选择开始游戏模式
public void launch(){
setTitle("TankWar");
setSize(width,height);
setLocationRelativeTo(null); //使屏幕居中
setDefaultCloseOperation(3); //添加关闭事件
setResizable(false); //用户不能改变大小
setVisible(true); //使窗口可见
this.addKeyListener(new GamePanel.KeyMonitor()); //添加键盘监视器
while(true){ //重绘
repaint();
try {
Thread.sleep(25);
}catch (Exception e){
e.printStackTrace();
}
}
}
//paint()方法
@Override
public void paint(Graphics g){
//创建和容器一样大小的Image图片
if(offScreemImage == null){
offScreemImage = this.createImage(width,height);
}
//获取该图片的画笔
Graphics gImage = offScreemImage.getGraphics();
gImage.setColor(Color.gray);
gImage.fillRect(0,0,width,height); //绘制实心矩形
gImage.setColor(Color.blue);
gImage.setFont(new Font("仿宋",Font.BOLD,50));
if(state == 0) { //state = 0, 游戏未开始
gImage.drawString("选择游戏模式", 220, 100);
gImage.drawString("单人模式", 220, 200);
gImage.drawString("双人模式", 220, 300);
gImage.drawImage(select, 160, y, null); //绘制指针
}
else if(state == 1 || state == 2){
gImage.drawString("游戏开始",220,100);
if(state == 1){
gImage.drawString("单人模式",220,200);
}else{
gImage.drawString("双人模式",220,200);
}
}
/**将缓存区绘制好的图形整个绘制到容器的画布中**/
g.drawImage(offScreemImage,0,0,null);
}
class KeyMonitor extends KeyAdapter{ //键盘监视器
@Override //按下键盘
public void keyPressed(KeyEvent e){
//返回键值
int key = e.getKeyCode();
switch (key){
case KeyEvent.VK_UP: //按键1的键值
a = 1;
y = 150;
break;
case KeyEvent.VK_DOWN:
a = 2;
y = 250;
break;
case KeyEvent.VK_ENTER:
state = a;
break;
}
// System.out.println(e.getKeyChar()); //返回键值 输出按键
}
}
public static void main(String[] args) {
GamePanel gp = new GamePanel();
gp.launch();
}
}