Tifa Tifa - 8 days ago 5
Java Question

Applet not showing image

I was following this tutorial here

and I downloaded its source code and ran but the image is not showing.

here is the result
enter image description here

I was expecting that the result would be like this
enter image description here
same as the result in the tutorial.

Here is the code:
StartingClass.java

package kiloboltgame;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;

public class StartingClass extends Applet implements Runnable, KeyListener {

private Robot robot;
private Image image, character;
private Graphics second;
private URL base;

@Override
public void init() {

setSize(800, 480);
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Q-Bot Alpha");
try {
base = getDocumentBase();

} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
}

// Image Setups
character = getImage(base, "data/character.png");
System.out.println(" "+base);

}

@Override
public void start() {
robot = new Robot();

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

@Override
public void stop() {
// TODO Auto-generated method stub
}

@Override
public void destroy() {
// TODO Auto-generated method stub
}

@Override
public void run() {
while (true) {
robot.update();
repaint();
try {
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

@Override
public void update(Graphics g) {
if (image == null) {
image = createImage(this.getWidth(), this.getHeight());
second = image.getGraphics();
}

second.setColor(getBackground());
second.fillRect(0, 0, getWidth(), getHeight());
second.setColor(getForeground());
paint(second);

g.drawImage(image, 0, 0, this);

}

@Override
public void paint(Graphics g) {
g.drawImage(character, robot.getCenterX() - 61, robot.getCenterY() - 63, this);

}

@Override
public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
System.out.println("Move up");
break;

case KeyEvent.VK_DOWN:
System.out.println("Move down");
break;

case KeyEvent.VK_LEFT:
robot.moveLeft();
break;

case KeyEvent.VK_RIGHT:
robot.moveRight();
break;

case KeyEvent.VK_SPACE:
System.out.println("Jump");
robot.jump();
break;

}

}

@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
System.out.println("Stop moving up");
break;

case KeyEvent.VK_DOWN:
System.out.println("Stop moving down");
break;

case KeyEvent.VK_LEFT:
robot.stop();
break;

case KeyEvent.VK_RIGHT:
robot.stop();
break;

case KeyEvent.VK_SPACE:
System.out.println("Stop jumping");
break;
}

}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}


Robot.java

package kiloboltgame;

import java.awt.Graphics;

public class Robot {

private int centerX = 100;
private int centerY = 382;
private boolean jumped = false;

private int speedX = 0;
private int speedY = 1;


public void update() {

// Moves Character or Scrolls Background accordingly.
if (speedX < 0) {
centerX += speedX;
} else if (speedX == 0) {
//System.out.println("Do not scroll the background.");

} else {
if (centerX <= 150) {
centerX += speedX;
} else {
//System.out.println("Scroll Background Here");
}
}

// Updates Y Position
centerY += speedY;
if (centerY + speedY >= 382) {
centerY = 382;
}

// Handles Jumping
if (jumped == true) {
speedY += 1;

if (centerY + speedY >= 382) {
centerY = 382;
speedY = 0;
jumped = false;
}

}

// Prevents going beyond X coordinate of 0
if (centerX + speedX <= 60) {
centerX = 61;
}
}

public void moveRight() {
speedX = 6;
}

public void moveLeft() {
speedX = -6;
}

public void stop() {
speedX = 0;
}

public void jump() {
if (jumped == false) {
speedY = -15;
jumped = true;
}

}

public int getCenterX() {
return centerX;
}

public int getCenterY() {
return centerY;
}

public boolean isJumped() {
return jumped;
}

public int getSpeedX() {
return speedX;
}

public int getSpeedY() {
return speedY;
}

public void setCenterX(int centerX) {
this.centerX = centerX;
}

public void setCenterY(int centerY) {
this.centerY = centerY;
}

public void setJumped(boolean jumped) {
this.jumped = jumped;
}

public void setSpeedX(int speedX) {
this.speedX = speedX;
}

public void setSpeedY(int speedY) {
this.speedY = speedY;
}

}


and here is my file structure in intelij

enter image description here

Whats wrong with the code?? I tride the "../data/character.png" and "../src/data/character.png" but it didnt work.

Answer
  • applet.html the page loading the applet.
  • data (directory)
    • Character.png

If that is the structure of the server, the image will be available by:

getImage(base, "data/character.png");

I stressed server above since that is apparently not how your IDE is set up.


Can you elaborate more?

You opened the src/kilobolt path to show the locations of the source files, but it you expand the bin folder and trace down, you'll probably find the .class files in the bin/kilobolt directory.

An IDE typically won't use an HTML file for loading the applet, but if IntelliJ did, it would probably put it in the bin directory so it has direct access to the class files. The path from there to the image would be ../data/character.png, but instead of using that path, suggest you get the IDE to copy the image into the bin.

At this stage it has become about IntelliJ so any further questions you have, will need to be about the IDE and the run-time class-path it uses.

Comments