java未,java – 图像未加载

框架窗口正在启动,但背景和前景图像未加载,窗框尺寸也非常小.

请帮我修复错误.

这是发布的代码

Aquarium.java

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 fishes=new Vector();

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("src\fish1.gif");

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

System.out.println("fish 1 size "+Toolkit.getDefaultToolkit().getImage("src\fish1.gif").getWidth(null));

fishImages[1]=Toolkit.getDefaultToolkit().getImage("src\fish2.gif");

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

aquariumImage =Toolkit.getDefaultToolkit().getImage("src\bubbles.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

{

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

{

((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);

}

}

}

解决方法:

很抱歉这样说,但你的代码有很多问题……

让我们开始:

>请勿覆盖顶级容器的任何涂装方法.首先,没有顶级容器是双缓冲的.

>使用轻量级组件而不是重量级组件(使用JFrame代替Frame,使用JPanel代替Panel)…

>使用JPanel作为绘画表面而不是框架,原因与上述相同……

>如前所述,你的线程代码什么都不做(新的Thread().start()).

>你没有油漆代码来实际将鱼类画在屏幕上(是的,你的鱼有油漆代码,但没有任何东西在调用它).

>您的随机数生成器不起作用.我让所有的鱼都准确地在同一个地方游泳……

>你的图像加载代码是错误的.请改用ImageIO

>不要直接存储矩形参考.问题是,如果调整窗口大小,游泳鱼的可用范围将会改变,即使它们被包含在水族箱的范围内,水族馆的位置也可能发生变化.

>正如mentioed,您的图像路径不正确.你永远不会在任何路径中包含src.部署后,src路径将不再存在.

这是我的看法……

水族馆

public class Aquarium extends JPanel {

public static final int NUMNBER_OF_FISHIES = 12;

private BufferedImage masterFish;

private Vector fishes = new Vector(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);

}

}

}

标签:paintcomponent,java,image,swing,frame

来源: https://codeday.me/bug/20190916/1807069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值