java中的repaint()的方法没有调用paintComponent方法,测了一下其他都正常,就是真的没有调用,我是java初学者,找了个贪吃蛇游戏准备写写的,结果卡这里卡了几个小时了,求解
这是启动类
package Demo;
import javax.swing.*;
public class MySnake {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
//界面位置
jFrame.setBounds(700,100 ,700,900);
jFrame.add(new MyPanel() );
//设置不允许拖拽+
jFrame.setResizable(false);//为啥还是能拖拽
jFrame.add(new MyPanel());
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示
jFrame.setVisible(true);
}
}
这个是出问题的类
package Demo;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class MyPanel extends JPanel implements KeyListener {
int len;
ImageIcon right ;
ImageIcon body ;
ImageIcon left;
ImageIcon top;
ImageIcon down;
int [] snakeX ;//蛇的容器x坐标和y坐标
int [] snakeY ;
boolean isStart = false;
public MyPanel() {
//以下为图片的绝对路径
String pathRight = Thread.currentThread().getContextClassLoader().
getResource("picture/right.png").getPath();
String pathBody = Thread.currentThread().getContextClassLoader().
getResource("picture/body.png").getPath();
String pathLeft = Thread.currentThread().getContextClassLoader().
getResource("picture/left.png").getPath();
String pathTop = Thread.currentThread().getContextClassLoader().
getResource("picture/top.png").getPath();
String pathDown = Thread.currentThread().getContextClassLoader().
getResource("picture/bottom.png").getPath();
this.right = new ImageIcon(pathRight);
this.body = new ImageIcon(pathBody);
this.left = new ImageIcon(pathLeft);
this.top = new ImageIcon(pathTop);
this.down = new ImageIcon(pathDown);
len = 3;//蛇的初始长度为3
snakeX = new int[1008];
snakeY = new int[1008];
snakeX[0] = 100;
snakeY[0] = 100;
snakeX[1] = 75;
snakeY[1] = 100;
snakeX[2] = 50;
snakeY[2] = 100;
this.setFocusable(true);//键盘事件
this.addKeyListener(this);//用来监听键盘事件
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("ssss");
this.setBackground(Color.red);
g.fillRect(0,0,700,900);
//利用枚举类型来控制蛇头方向
//right.paintIcon(this,g,snakeX[0],snakeY[0]);
Direction direction = Direction.LEFT;
switch (direction) {
case TOP:
top.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case DOWN:
down.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case LEFT:
left.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case RIGHT:
right.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
}
for (int i = 1; i < len; i++) {
body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
if(!isStart) {
//设置画笔颜色
g.setColor(Color.white);
//设置字体
Font f = new Font("华文行楷",Font.BOLD,50);
g.setFont(f);
//输出提示信息
g.drawString("请按空格键表示开始游戏!",50,450);
}
System.out.println("=========================");
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == 32) {
isStart = !isStart;
this.repaint();
}
System.out.println(isStart);
}
@Override
public void keyReleased(KeyEvent e) {
}
}
原因是你在MySnake中add了两次MyPanel。把你后面那个add去掉就好了
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if(i%2==0){
g.drawString(message1,getWidth()/2,getHeight()/2);
}
else{
g.drawString(message2,getWidth()/2,getHeight()/2);
}
}
因为paintComponent方法写在内部类里面,所以是共享私有成员变量的,每次点击,i自增,paintComponent方法利用取余的方式,自动切换所绘制的字符串。
因为希望在屏幕上绘制字符串,所以内部类继承了JPanel
static class ChangeMessage extends JPanel{}.....
完成以上工作后,在主类里面对这个内部类进行实例化,增加到frame里面即可。
你的问题是paintCompont方法中的打印没有被执行还是其他什么问题