java swing中用于绘制图像的for循环无效

java swing中用于绘制图像的for循环无效,java,swing,for-loop,Java,Swing,For Loop,您好,我是StackOverflow和java编程新手。 我在swing中尝试绘制图像时遇到问题。 这幅画不是用for循环画的。但是当我删除for循环时,它工作得很好。 我的密码是- package Space; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav

您好,我是StackOverflow和java编程新手。 我在swing中尝试绘制图像时遇到问题。 这幅画不是用for循环画的。但是当我删除for循环时,它工作得很好。 我的密码是-

package Space;

 import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Action;
import javax.swing.JPanel;
import javax.swing.Timer;



public class graph extends JPanel implements ActionListener{
    private int player_x = 280;
    private final int no = 5;
    private final int delay = 8;
    private Timer timer = new Timer(delay, this);
    private BufferedImage back;
    private BufferedImage player;
    private BufferedImage enemy;
    private int ax[] = new int[no];
    private int ay[] = new int[no];
    private int x_velo = 5;


    public graph() {
    
        KeyListener listener = new KeyListener() {
        
        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
                if((player_x == 600)) {
                    player_x-=20;
                }
                player_x+=20;
            }
            if(e.getKeyCode() == KeyEvent.VK_LEFT) {
                if(player_x==0) {   
                    player_x+=20;
                }
                player_x-=20;
            }
            
        }
    };
    
    addKeyListener(listener);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    
    try {
        back = ImageIO.read(new File(".//res//background.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    try {
        enemy = ImageIO.read(new File(".//res//enemy.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    try {
        player = ImageIO.read(new File(".//res//player.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
    change_alien();
    repaint();
    
    
}

public void paint(Graphics g) {
    g.drawImage(back, 0,0,700,600,this);
    g.drawImage(player, player_x,450,this);
    
    
    for(int h=no;h==0;h--) {
    g.drawImage(enemy, ax[h-1],50,this);
    }
    
}

public void change_alien() {
    
    
        for(int y = no;y==0;y--) {
         ax[y-1]+=x_velo;
        }
         
    }
}
但我的输出是-

为什么我的敌人形象没有被画出来? 即使我添加了一个for循环来绘制它,并且列表“ax”也已更新(通过for循环)


请帮助我,我在这方面已经挣扎了好几个小时。

因为您是Java和Swing新手,我建议您完成。for循环执行得非常快,您只能看到最终结果。不要使用“for循环”!!!摆动计时器取代了循环逻辑。每次定时器触发时,您都会更改图像的位置并调用“重新绘制”。下面是一个基本示例:。您会注意到动画不需要循环代码。@camickr“您会注意到没有循环代码”,但
计时器不只是“隐藏”循环吗?老实说,我不看核心类的代码——我真的不在乎它们的方法是如何实现的,只要行为有很好的文档记录,并且它们“按照宣传的那样工作”。@AndrewThompson,我不确定你的观点是什么。这也是我对动画的基本建议。然而,我将补充一条评论,如果图像从未被看到,那么可能的原因是图像的“x”值为负值,并且图像被画出屏幕(由于循环逻辑执行不正确)@camickr My bad。我想一个新的程序员可能会认为,因为你链接的代码中没有循环,所以根本就没有循环。警告:我睡眠不足,所以可能在胡说八道。我现在要安静了。