我看了网上AWT的教程后 自己写了一下案例但是Canvas什么都不显示,后面我把作者写的试了一遍却可以,我对比了好久都没有有什么不一样。
代码1是我写的, 代码2是别人的。
代码1:
package com.java.AWT;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PinBall {
private Frame frame = new Frame("title");
//桌面的宽高
private final int TABLE_WIDTH = 300;
private final int TABLE_HIGHT = 400;
//球拍的宽高
private final int RACKET_WIDTH = 60;
private final int RACKET_HIGHT = 20;
//小球的大小 直径
private final int BALL_SIZE = 16;
//球拍的位置
private int racketX = 120;
private final int racketY = 340;
//小球的位置
private int ballX = 120;
private int ballY = 20;
//小球在X和Y轴上面的速度
private int speedX = 10;
private int speedY = 5;
//游戏是否结束
private boolean IsOver = false;
//计时器
private Timer timer;
private class MyCanvas extends Canvas {
@Override
public void print(Graphics g) {
System.out.println("print 被调用了");
//TODO 在这里进行绘制
if (IsOver) { //游戏结束
//绘制结束
g.setColor(Color.BLUE);
g.setFont(new Font("Times", Font.BOLD, 30));
g.drawString("游戏结束!", 50, 190);
} else { //游戏中
//绘制小球
g.setColor(Color.RED);
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
//绘制球拍
g.setColor(Color.PINK);
g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HIGHT);
}
}
}
MyCanvas DrawArea = new MyCanvas();
private void init() { //组装界面
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
System.out.println("keyListener");
if (keycode == KeyEvent.VK_LEFT) { //按下了左键
if (racketX > 0) {
racketX -= 10;
}
}
if (keycode == KeyEvent.VK_RIGHT) { //按下了右键
if (racketX < (TABLE_WIDTH - RACKET_WIDTH)) {
racketX += 10;
}
}
}
};
frame.addKeyListener(listener);
DrawArea.addKeyListener(listener);
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("task");
//检测是否碰撞到边缘, 改变小球运动方向
if (ballX <= 0 || ballX >= (TABLE_WIDTH - BALL_SIZE)) {
speedX = -speedX;
}
if (ballY <= 0 || (ballY > racketY - BALL_SIZE && ballX > racketX && ballX < racketX + RACKET_WIDTH)) {
speedY = -speedY;
}
if (ballY > racketY - BALL_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
//当前小球超出了球拍的范围,游戏结束
timer.stop();
IsOver = true;
DrawArea.repaint();
}
//改变小球的位置
ballX = ballX + speedX;
ballY = ballY + speedY;
//重新绘制画面
DrawArea.repaint();
}
};
timer = new Timer(100,task);
timer.start();
DrawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HIGHT));
frame.add(DrawArea);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new PinBall().init();
}
}
代码2:
package com.java.AWT;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PinBall {
private Frame frame = new Frame("title");
//桌面的宽高
private final int TABLE_WIDTH = 300;
private final int TABLE_HIGHT = 400;
//球拍的宽高
private final int RACKET_WIDTH = 60;
private final int RACKET_HIGHT = 20;
//小球的大小 直径
private final int BALL_SIZE = 16;
//球拍的位置
private int racketX = 120;
private final int racketY = 340;
//小球的位置
private int ballX = 120;
private int ballY = 20;
//小球在X和Y轴上面的速度
private int speedX = 10;
private int speedY = 5;
//游戏是否结束
private boolean IsOver = false;
//计时器
private Timer timer;
private class MyCanvas extends Canvas {
@Override
public void print(Graphics g) {
System.out.println("print 被调用了");
//TODO 在这里进行绘制
if (IsOver) { //游戏结束
//绘制结束
g.setColor(Color.BLUE);
g.setFont(new Font("Times", Font.BOLD, 30));
g.drawString("游戏结束!", 50, 190);
} else { //游戏中
//绘制小球
g.setColor(Color.RED);
g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
//绘制球拍
g.setColor(Color.PINK);
g.fillRect(racketX, racketY, RACKET_WIDTH, RACKET_HIGHT);
}
}
}
MyCanvas DrawArea = new MyCanvas();
private void init() { //组装界面
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
System.out.println("keyListener");
if (keycode == KeyEvent.VK_LEFT) { //按下了左键
if (racketX > 0) {
racketX -= 10;
}
}
if (keycode == KeyEvent.VK_RIGHT) { //按下了右键
if (racketX < (TABLE_WIDTH - RACKET_WIDTH)) {
racketX += 10;
}
}
}
};
frame.addKeyListener(listener);
DrawArea.addKeyListener(listener);
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("task");
//检测是否碰撞到边缘, 改变小球运动方向
if (ballX <= 0 || ballX >= (TABLE_WIDTH - BALL_SIZE)) {
speedX = -speedX;
}
if (ballY <= 0 || (ballY > racketY - BALL_SIZE && ballX > racketX && ballX < racketX + RACKET_WIDTH)) {
speedY = -speedY;
}
if (ballY > racketY - BALL_SIZE && (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {
//当前小球超出了球拍的范围,游戏结束
timer.stop();
IsOver = true;
DrawArea.repaint();
}
//改变小球的位置
ballX = ballX + speedX;
ballY = ballY + speedY;
//重新绘制画面
DrawArea.repaint();
}
};
timer = new Timer(100,task);
timer.start();
DrawArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HIGHT));
frame.add(DrawArea);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new PinBall().init();
}
}
Canvas不显示
我试了一下我重写的Canvas的print方法没有执行
Canvas显示
问题解决了。是我单词写错了
你这代码2,也出不来结果啊