图像未加载 [英] the images are not loading

查看:31
本文介绍了图像未加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

框架窗口正在启动但背景和前景图像没有加载并且窗口框架尺寸也非常非常小.请帮我修正错误.

The frame window is launching but the background and the foreground images are not loading and the window frame size is also very very small. Please help me to fix the error.

这是发布的代码

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.util.Vector;

public class Aquarium extends Frame implements Runnable
{
    Image aquariumImage,memoryImage;
    BufferedImage bImage;
    Graphics memoryGraphics;
    Image [] fishImages=new Image[2];
    MediaTracker tracker;
    int numberFishes=12;
    Vector<Fish> fishes=new Vector<Fish>();
    Thread thread;
    boolean runOk=true;
    int sleepTime=110;
    Fish fish;

    Aquarium()
    {

        //set the title and assign tracker object
        setTitle("The Aquarium ");
        tracker=new MediaTracker(this);


        //add images to the tracker object to trace it


        fishImages[0]=Toolkit.getDefaultToolkit().getImage("srcfish1.gif");


        tracker.addImage(fishImages[0], 0);

        System.out.println("fish 1 size "+Toolkit.getDefaultToolkit().getImage("srcfish1.gif").getWidth(null));
        fishImages[1]=Toolkit.getDefaultToolkit().getImage("srcfish2.gif");


        tracker.addImage(fishImages[1], 0);
        aquariumImage =Toolkit.getDefaultToolkit().getImage("srcubbles.gif");


        tracker.addImage(aquariumImage,0);


        setResizable(true);

        setVisible(true);

        //assign memory to the graphics and anotherImage object

        int dx=getSize().width;
        int dy=getSize().height;
        System.out.println("x value is "+dx+ " dy value is "+ dy);

        bImage=new BufferedImage(dx, dy,BufferedImage.TYPE_INT_ARGB);


        try
        {
        memoryGraphics=bImage.getGraphics();

        }
        catch(Exception exc)
        {
            System.out.println(exc.getCause());
            System.out.println(exc.getStackTrace());
        }
        //create a new thread and start the thread

        thread=new Thread();
        thread.start();





        try
        {
            tracker.waitForID(0);
        }
        catch (Exception ex) {
            System.out.println(ex.getMessage());
        }

        setSize(aquariumImage.getWidth(this),aquariumImage.getHeight(this));



        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we)
            {
                System.exit(0);
                runOk=false;
            }
        });
    }


    public static void main(String ar[])
    {
        new Aquarium();
    }


    @Override
    public void run() 
    {


        //draw 4 edges of rectangle

        Rectangle edges=new Rectangle(0+getInsets().left,0+getInsets().top,
                                        getSize().width-(getInsets().left+getInsets().right),
                                        getSize().height-(getInsets().top+getInsets().bottom));


        //add fishes to the fishes vector

        for (int loopIndex=0; loopIndex<numberFishes;loopIndex++)
        {
            fishes.add(new Fish(fishImages[0],fishImages[1],edges,this));
            try
            {
                Thread.sleep(20);
            }
            catch (Exception e) {
                System.out.println(e.getMessage());

            }
        }




        while(runOk)
        {
            for(int loopIndex=0; loopIndex < numberFishes; loopIndex++)
            {
                fish=(Fish)fishes.elementAt(loopIndex);
                fish.swim();
            }

            try
            {
                Thread.sleep(sleepTime);
            }
            catch (Exception e) {
                System.out.println(e.getMessage());
            }
            repaint();
        }

    }
    public void update(Graphics g)
    {
        memoryGraphics.drawImage(aquariumImage, 0, 0, this);

        for(int loopIndex=0;loopIndex<numberFishes;loopIndex++)
        {
            ((Fish)fishes.elementAt(loopIndex)).drawFishImage(memoryGraphics);
        }
        g.drawImage(bImage, 0, 0, this);
    }
}

fish.java

import java.awt.*;
import java.util.Random;


public class Fish {

    Component tank;
    Image image1,image2;
    Point location,velocity;
    Rectangle edges;
    Random random;

    public Fish(Image image1,Image image2, Rectangle edges,Component tank) {
        random = new Random(System.currentTimeMillis());
        this.tank=tank;
        this.image1=image1;
        this.image2=image2;
        this.edges=edges;           
        this.location=new Point(100+ (Math.abs(random.nextInt())%300),
            100+Math.abs(random.nextInt())%100));    
        this.velocity=new Point(random.nextInt()%8,random.nextInt()%8);
    }

    public void swim() {

        //determine the optimum velocity to make the fish swim

        if(random.nextInt()%7<=1) {
            velocity.x += random.nextInt() % 4 ;
            velocity.x = Math.min(velocity.x, 8);
            velocity.x = Math.max(velocity.x, -8);
            velocity.y += random.nextInt() % 4;             
            velocity.y =  Math.min(velocity.y, 8);
            velocity.y = Math.max(velocity.y, -8);
        }

        //add the velocity to the location of the fish to make it move

        location.x += velocity.x;
        location.y += velocity.y;

        if(location.x < edges.x) {
            location.x=edges.x;
            velocity.x = -velocity.x;
        }

        if((location.x + image1.getWidth(tank)) > (edges.x + edges.width)) {
            location.x = edges.x + edges.width - image1.getWidth(tank);
            velocity.x = -velocity.x;
        }

        if(location.y < edges.y) {
            location.y = edges.y;
            velocity.y = -velocity.y;
        }

        if((location.y + image1.getHeight(tank)) > (edges.y + edges.height)) {
            location.y = edges.y + edges.height - image1.getHeight(tank);
            velocity.y = -velocity.y;
        }
    }

    public void drawFishImage(Graphics g) {
        if(velocity.x < 0) {
                g.drawImage(image1,location.x,location.y,tank);             
        }           
        else {
            g.drawImage(image2, location.x, location.y, tank);
        }
    }
}

推荐答案

我很抱歉这么说,但是你的代码有很多问题......

I'm sorry to say this, but there are simply so many things wrong with your code...

让我们开始:

  • 不要覆盖顶级容器的任何 paint 方法.首先,没有一个顶级容器是双缓冲的.
  • 使用轻量级组件代替重量级组件(使用JFrame代替Frame,使用JPanel代替Panel)...
  • 使用 JPanel 作为您的绘画表面而不是 Frame,原因与上述相同...
  • 如前所述,您的线程代码什么都不做(new Thread().start()).
  • 您没有将鱼实际绘制到屏幕上的绘制代码(是的,您的鱼有绘制代码​​,但没有调用它).
  • 您的随机数生成器不起作用.我让所有的鱼都在同一个地方游泳......
  • 您的图片加载代码有误.使用 ImageIO 代替
  • 不要直接存储矩形引用.问题是,如果调整窗口大小,鱼游入的可用范围会发生变化,即使它们被包含在水族箱的范围内,水族箱的位置也有可能发生了变化.
  • 如前所述,您的图像路径不正确.您永远不会在任何路径中包含 src.部署后,src 路径将不再存在.
  • DON'T override any of the paint methods of a top level container. To start with, none of the top level containers are double buffered.
  • Use light weight components instead of heavy weight components (use JFrame instead of Frame, use JPanel instead of Panel)...
  • Use JPanel as your painting surface instead of the Frame, for the same reasons as stated above...
  • As mentioned, you're thread code was doing nothing (new Thread().start()).
  • You had no paint code to actually paint the fishies onto the screen (yes your fish had paint code, but nothing was calling it).
  • You random number generator doesn't work. I got all the fish to swim exactly in the same place...
  • You're image loading code is wrong. Use ImageIO instead
  • Don't store the rectangle reference directly. The problem is, if the window is resized, the available bounds for the fish to swim in will change, even if they are contained to within the bounds of the aquarium, it's possible for the location of the aquarium to have changed.
  • As mentioed, you image paths are incorrect. You never include src in any path. Once deployed, the src path will no longer exist.

这是我的看法...

public class Aquarium extends JPanel {

    public static final int NUMNBER_OF_FISHIES = 12;

    private BufferedImage masterFish;
    private Vector<Fish> fishes = new Vector<Fish>(NUMNBER_OF_FISHIES);
    private int sleepTime = 110;

    public Aquarium() {

        //set the title and assign tracker object

        try {
            masterFish = ImageIO.read(getClass().getResource("/gnome_panel_fish.png"));
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }

        // This is a little cheat which means you only ever need one fish image
        // Basically it will flip the master along it's horizontal axies ;)
        BufferedImage flippedMaster = new BufferedImage(masterFish.getWidth(), masterFish.getHeight(), masterFish.getType());
        Graphics2D g2d = flippedMaster.createGraphics();
        g2d.setTransform(AffineTransform.getScaleInstance(-1, 1));
        g2d.drawImage(masterFish, -masterFish.getWidth(), 0, this);
        g2d.dispose();

        for (int index = 0; index < NUMNBER_OF_FISHIES; index++) {
            fishes.add(new Fish(masterFish, flippedMaster, this));
        }

        Thread background = new Thread(new Background());
        background.setDaemon(true);
        background.start();

    }

    public static void main(String ar[]) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException classNotFoundException) {
                } catch (InstantiationException instantiationException) {
                } catch (IllegalAccessException illegalAccessException) {
                } catch (UnsupportedLookAndFeelException unsupportedLookAndFeelException) {
                }

                JFrame frame = new JFrame("The Aquarium ");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new Aquarium());
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        for (Fish fish : fishes) {
            fish.drawFishImage(g);
        }

    }

    protected class Background implements Runnable {

        @Override
        public void run() {

            while (true) {

                for (Fish fish : fishes) {
                    fish.swim();
                }

                try {
                    Thread.sleep(sleepTime);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                repaint();
            }
        }
    }
}

public class Fish {

    private Component tank;
    private Image image1, image2;
    private Point location, velocity;
    private Random random;

    public Fish(Image image1, Image image2, Component tank) {
        random = new Random();
        this.tank = tank;
        this.image1 = image1;
        this.image2 = image2;
        this.location = new Point(
                        100 + (Math.abs(random.nextInt()) % 300),
                        100 + Math.abs(random.nextInt()) % 100);
        this.velocity = new Point(random.nextInt() % 8, random.nextInt() % 8);
        System.out.println(location);
    }

    public void swim() {

        Rectangle edges = tank.getBounds();

        //determine the optimum velocity to make the fish swim

        if (random.nextInt() % 7 <= 1) {
            velocity.x += random.nextInt() % 4;
            velocity.x = Math.min(velocity.x, 8);
            velocity.x = Math.max(velocity.x, -8);
            velocity.y += random.nextInt() % 4;
            velocity.y = Math.min(velocity.y, 8);
            velocity.y = Math.max(velocity.y, -8);
        }

        //add the velocity to the location of the fish to make it move

        location.x += velocity.x;
        location.y += velocity.y;

        if (location.x < edges.x) {
            location.x = edges.x;
            velocity.x = -velocity.x;
        }

        if ((location.x + image1.getWidth(tank)) > (edges.x + edges.width)) {
            location.x = edges.x + edges.width - image1.getWidth(tank);
            velocity.x = -velocity.x;
        }

        if (location.y < edges.y) {
            location.y = edges.y;
            velocity.y = -velocity.y;
        }

        if ((location.y + image1.getHeight(tank)) > (edges.y + edges.height)) {
            location.y = edges.y + edges.height - image1.getHeight(tank);
            velocity.y = -velocity.y;
        }
    }

    public void drawFishImage(Graphics g) {
        if (velocity.x < 0) {
            g.drawImage(image1, location.x, location.y, tank);
        } else {
            g.drawImage(image2, location.x, location.y, tank);
        }
    }
}

这篇关于图像未加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆