I have been searching for an answer to this for two days now, but that didn't seem to solve much. Mostly because i don't really understand what is causing my error in the first place, nor would i know how to go about fixing the problem.
I've been trying to make an "animation" of sorts, where one of the layers in it spawn circles on the right side of the screen and send them to the left over time. Problem is every time it is meant to spawn a circle, it doesn't appear and i get an error.
Exception in thread "Thread-4" java.lang.NullPointerException
at Ball.draw(Ball.java:39)
at Ball.run(Ball.java:23)
Here is the class that is causing the errors:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;
public class Ball extends Thread{
JPanel drawingPanel;
private int x=400,y=200;
private int dx=-2,dy=0;
private static final int XSIZE=10,YSIZE=10;
Random rdm = new Random();
int y_rdm = rdm.nextInt(440)+30;
public Ball(JPanel jp){
drawingPanel=jp;
dx-=1;
}
public void run(){
draw();
for (int i=0;i<1000;i++){
try{
Thread.sleep(10);
}
catch(InterruptedException e){}
move();
}
}
private void move(){
erase();
changePos();
draw();
}
private void draw(){
Graphics g = drawingPanel.getGraphics();
g.setColor(Color.WHITE);
g.fillOval(x,y_rdm,XSIZE,YSIZE);
g.dispose();
}
private void erase(){
Graphics g=drawingPanel.getGraphics();
g.setColor(drawingPanel.getBackground());
g.fillOval(x,y_rdm,XSIZE,YSIZE);
g.dispose();
}
private void changePos(){
x+=dx;y_rdm+=dy;
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class BallPanel extends JPanel implements ActionListener{
JPanel drawingPanel = new JPanel();
public BallPanel(){
int delay = 300;
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Ball b= new Ball(drawingPanel);
b.start();
}
};
new Timer(delay, taskPerformer).start();
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
import java.awt.BorderLayout;
import java.awt.Color;
import java.io.InputStream;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javazoom.jl.player.Player;
public class Window extends JFrame{
private JLayeredPane layerpane;
private JPanel up, down;
public Window(){
layerpane = new JLayeredPane();
down = new JPanel();
down.setBounds(0, 0, 450, 450);
down.setBackground(new Color(0, 51, 102));
layerpane.add(down, new Integer(1));
BallPanel bp = new BallPanel();
layerpane.add(bp, new Integer(2));
bp.setBounds(0, 0, 450, 450);
bp.setOpaque(!bp.isOpaque());
Animation2 ani2 = new Ani2();
ani2.setBounds(0, 0, 400, 450);
layerpane.add(ani2, new Integer(3));
ani2.setOpaque(!ani2.isOpaque());
getContentPane().add(layerpane, BorderLayout.CENTER);
}
public static void main(String args[]){
JFrame f = new Window();
f.setVisible(true);
f.setSize(450,450);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try{
URL url = new URL("file:///C://song.mp3");
InputStream in = url.openStream();
Player pl = new Player(in);
pl.play();
}
catch(Exception e){
e.printStackTrace();
}
}
}
Please tell me if i need to include my other classes, they just seem slightly irrelevant.
drawingPanel.getGraphics()returns null. Read about this here and in StackOverflow post