1

我在 ImageIcon 数组中声明了 30 个 ImageIcon。我已经使用 FOR 循环声明了它们。唯一的问题是,当我尝试将 ImageIcon 添加到 JLabel 并在屏幕上显示 JPanel 时,它不起作用。这是我的代码:

package screens;

import javax.swing.*;

import java.awt.*;

public class gameScreen extends JPanel {
        private static final long serialVersionUID = 1L;
        // -------------VARIABLES---------------//
        Image wallpaper  = (Image)Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/wallpaper.jpg"));


        ImageIcon[] teamsImg = new ImageIcon[30];
        public gameScreen() {

        for(int i = 0;i>30;i++){
            teamsImg[i] = new ImageIcon(Toolkit.getDefaultToolkit().getImage(
        getClass().getResource("images/img.png")));


         }

         JLabel label = new JLabel(teamsImg[27]);
         add(label);

    }

// -------------PAINT FUNCTION----------//
public void paintComponent(Graphics g) {
     g.drawImage(wallpaper,0,0,null);



}

}
4

1 回答 1

3

我会花很长时间,认真地看看这条线......

for (int i = 0; i > 30; i++) {

正如亚当萨维奇所说,“好吧,这就是你的问题”。

就个人而言,我会使用ImageIOover Toolkit.getImage,除非您有充分的理由不这样做(例如,Toolkit.getImage由于网络连接速度较慢,您需要后台加载功能)。 ImageIO由于它的插件架构以及保证当它返回时,图像将完全加载,它将使您可以访问更广泛的可能图像格式。

就像是...

try {
    wallpaper = ImageIO.read(getClass().getResource("images/wallpaper.jpg"));

    for (int i = 0; i < 30; i++) {

        teamsImg[i] = ImageIO.read(getClass().getResource("images/img.png"));

    }
} catch (IOException iOException) {
    System.err.println("Bad things happened");
    iOException.printStackTrace();
}

这将需要使用Image而不是ImageIcon存储图像,但它为您带来的好处有点牺牲。

另外,您知道,您一遍又一遍地加载相同的图像???您可以只加载一次并设置对数组中每个元素的引用,它实际上是同一件事......(据我了解,图像 API 使用缓存版本来更快地重复加载)

在此处输入图像描述

于 2012-10-04T00:44:57.910 回答