Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载图像列表时,仅显示一个图像_Java_Image_Swing_Jframe_Jpanel - Fatal编程技术网

Java 加载图像列表时,仅显示一个图像

Java 加载图像列表时,仅显示一个图像,java,image,swing,jframe,jpanel,Java,Image,Swing,Jframe,Jpanel,我正在写一个塔防游戏,我需要将一个带有缓冲图像的JPanel列表加载到JFrame上。我使用for循环将JPanel放在JFrame上,但是,当我运行程序时,只有列表中的最后一个JPanel显示出来。我已经检查,以确保图像没有被放置在另一个,他们被放置在三个不同的位置 下面是创建JFrame的类的代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.List; import j

我正在写一个塔防游戏,我需要将一个带有缓冲图像的JPanel列表加载到JFrame上。我使用for循环将JPanel放在JFrame上,但是,当我运行程序时,只有列表中的最后一个JPanel显示出来。我已经检查,以确保图像没有被放置在另一个,他们被放置在三个不同的位置

下面是创建JFrame的类的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;    

public class GameScreen extends JPanel 
                    implements MouseListener {

    private ArrayList< JPanel > images;
    private TDGame currentGame;
    private JFrame frame;
    private static final int width = 700;
    private static final int length = 700;

    public void mouseExited(MouseEvent e) {
        this.repaint();
    }
    
    public void mouseEntered(MouseEvent e) {
        this.repaint();
    }
    
    public void mouseReleased(MouseEvent e) {
        this.repaint();
    }
    
    public void mousePressed(MouseEvent e) {
        this.repaint();
    }
    
    public void mouseClicked(MouseEvent e) {
        this.repaint();
    }
    
    public GameScreen() {
        super();
        images = new ArrayList<JPanel>();
        currentGame = new TDGame();
        frame = new JFrame("Tower Defense");
        frame.setSize(width, length);
        frame.setVisible(true);
        frame.pack();
        frame.getContentPane().add(this,BorderLayout.CENTER);
        currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
                                new BasicEnemy(0, 0, LoadImage()));
        currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
                                new BasicEnemy(250, 250, LoadImage2()));
        currentGame.EnemyForce.add(currentGame.EnemyForce.size(),
                                new BasicEnemy(0, 0, LoadImage1()));

        this.repaint();
    }

    public BufferedImage LoadImage() {
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("Saturn-Intruder.png"));
        } catch (IOException e) {
        }
        return img;
    }
    
    public BufferedImage LoadImage1() {
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("Level1-TD.jpeg"));
        } catch (IOException e) {
        }
        return img;
    }
    
    public BufferedImage LoadImage2() {
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File("BlackBird-Intruder.jpeg"));
        } catch (IOException e) {
        }
        return img;
    }

    @Override
    protected void paintComponent(Graphics g) {
        for(int i = 0; i < currentGame.Defense.size(); i++) {
            frame.add(currentGame.Defense.get(i));
        }

        for(int i = 0; i < currentGame.EnemyForce.size(); i++) {
            frame.add( currentGame.EnemyForce.get(i));
        }

        for(int i = 0; i < currentGame.ShotsFired.size(); i++) {
            frame.add(currentGame.ShotsFired.get(i));
        }
    }
}

我怎样才能解决这个问题,使所有的图像都被放置,而不仅仅是一个图像?

我不知道为什么你的游戏只显示一个图像。但是随着这个游戏的进一步发展,我强烈建议您不要在自己的JPanel中添加每个图像

我将如何使用您的源代码使其工作

  • 将JPanel从BasicEnemy(以及所有其他类似的类)中删除
  • 将GameScreen.paintComponent中的所有循环更改为

    对于(…){currentGame.EnemyForce.get(i).paintComponent(g);}

  • 在游戏屏幕的构造器中添加
    frame.add(此)帧.setVisible(true)之前的右键
    frame.setVisible


如果你打算在Swing中使用图形,你永远不应该在JCompondents中保留游戏中的单个元素。您应该使用游戏屏幕作为“画布”,内部绘画组件使用图形对象来绘制所有游戏内容。

1)要更快获得更好的帮助,请发布一篇文章。2) 源代码中只有一行空白就足够了。
{
之后或
}
之前的空行通常也是多余的。3) 请学习类、方法和属性名称的通用(特别是用于名称的大小写),并一致使用它们。4) 对代码块使用一致的逻辑缩进。代码的缩进是为了帮助人们理解程序流程。1)不要设置顶级容器的大小。而是布局内容&调用
pack()
。2) 到部署时,这些资源很可能会成为一种资源。在这种情况下,必须通过
URL
而不是
File
访问资源。有关形成
URL
的方法,请参阅标签的。3) 不要在
paintComponent(..)
方法中添加组件,该方法本身将触发
repaint()
和无限循环。4) 在绘制图像时,请使用
ImageObserver
而不是
null
。事实上,我越是查看该源代码,就越认为您应该扔掉它,重新开始学习新的源代码。这是无法挽救的。即使您不应该在绘制方法中添加组件,添加更多组件只是将它们放置在边框布局的中心位置,这意味着只有最后添加的组件才可见
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

public class BasicEnemy extends Entity {
    JPanel ePanel;
    Graphics g;

    public BasicEnemy(double x, double y, BufferedImage image) {
        super(x, y, image);
        ePanel = new JPanel();
        ePanel.setVisible(true);
    }

    protected void paintComponent(Graphics g) {
        g.drawImage(getImage(), (int)(getXCoord()),
                            (int)(getYCoord()), null);
    }
}