java swing nullpointerexception jpanel paintcomponent

Excepción de Java en el hilo "AWT-EventQueue-0" java.lang.NullPointerException



swing jpanel (1)

Su objeto Level l parece ser null . Como no lo has inicializado y estás tratando de usarlo en el método moveUp() lanzando NullPointerException.

Debe inicializarlo de la siguiente manera.

Level l = new Level();

  1. Debe asignar valores double x = 1.0; . Puedo ver double x = 1; en todas partes, lo que podría darte resultados inesperados.

Esta pregunta ya tiene una respuesta aquí:

De acuerdo, lo que trato de hacer aquí es crear un juego donde el objeto / bola se controle haciendo clic en el objeto con el mouse, tirando hacia atrás el mouse (la distancia que retrocede el mouse determinará la velocidad del objeto) y en Al soltar el botón, el objeto se moverá (su ángulo de movimiento también estará determinado por el ángulo en que el mouse fue retirado)

Ahora, hasta donde puedo decir que el ''matemático'' al menos debería funcionar, lamentablemente no he podido probarlo ya que recibo el siguiente error.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Snail.moveUp(Snail.java:35) at Snail.chill(Snail.java:20) at Level.mouseReleased(Level.java:120) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

Por lo que entiendo esto significa que puedo haber declarado algo que tiene un valor nulo, pero esto me confunde ya que he hecho impresiones de todas mis variables y todos están dando valores.

Entonces asumí que tal vez le estoy diciendo al objeto que se mueva antes de que se haya declarado el valor, pero no puedo entender por qué eso estaría sucediendo.

Mi código es el siguiente.

import java.awt.*; import java.awt.event.*; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.event.MouseInputListener; @SuppressWarnings("serial") public class Level extends JPanel implements ActionListener, MouseInputListener{ Timer time; private Image i; private Graphics doubleG; Snail s, s2; boolean canJump; int sx2; int sy2; int sx3; int sy3; double clickX; double clickY; double relX; double relY; double angle; double speed; double distance; double scalex; double scaley; double velocityx = 1; double velocityy = 1; public Level(){ s = new Snail(); setFocusable(true); addMouseListener(this); addMouseMotionListener(this); //s2 = new Snail(250, 250); time = new Timer(17, this); time.start(); } @Override //double buffer public void update(Graphics g) { super.update(g); if(i == null){ i = createImage(this.getSize().width, this.getSize().height); doubleG = i.getGraphics(); } doubleG.setColor(getBackground()); doubleG.fillRect(0, 0, this.getSize().width, this.getSize().height); doubleG.setColor(getForeground()); paint(doubleG); g.drawImage(i, 0, 0, this); } public void actionPerformed(ActionEvent e){ s.update(this); //s2.update(this); repaint(); } public void paintComponent (Graphics g) { super.paintComponent(g); s.paint(g); //s2.paint(g); } @Override public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent ep) { clickX = ep.getX(); clickY = ep.getY(); } @Override public void mouseReleased(MouseEvent er) { relX = er.getX(); relY = er.getY(); angle = Math.toRadians(Math.atan2(clickY - relY, clickX - relX)); distance = Math.hypot(relX-clickX, relY-clickY); speed = distance/8; scalex = Math.cos(angle); scaley = Math.sin(angle); velocityx = speed * scalex; velocityy = speed * scaley; if (speed > 20){ speed = 20; } if (canJump) {s.moveUp(); } } @Override public void mouseDragged(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseMoved(MouseEvent em) { sx2 = s.x - s.radius; sy2 = s.y + s.radius; sx3 = s.x + s.radius; sy3 = s.y - s.radius; if (em.getX() >= sx2 && em.getX() <= sx3 && em.getY() >= sy3 && em.getY() <= sy2){ canJump = true; }else{ canJump = false; } System.out.println("Click X " + clickX + " Click Y " + clickY); System.out.println("Release X " + relX + " Release Y " + relY); System.out.println("angle" + angle); System.out.println("distance" + distance); System.out.println("velx " + velocityx); System.out.println("vely " + velocityy); System.out.println(scalex); System.out.println(scaley); System.out.println(" "); } }

Esta sería la segunda clase en la que parece estar ocurriendo el error, estoy recurriendo a una variable de instancia de la clase anterior.

import java.awt.Color; import java.awt.Graphics; public class Snail { Level l; private double gravity = 10; private double energyloss = 0.6; private double xFriction = .95; private double dt = .2; int x = 0; int y = 0; double dx = 0; double dy = 0; int radius = 30; public void chill(){ moveUp(); } public Snail() { // TODO Auto-generated constructor stub } public Snail(int i, int j) { // TODO Auto-generated constructor stub x = i; y = j; } public void moveUp() { dx = dx + l.velocityx; dy = dy + l.velocityy; } public void update(Level l){ if (x + dx > l.getWidth() -radius){ x = l.getWidth() -radius; dx = - dx; }else if( x + dx < 0 +radius){ x = 0+radius; dx = -dx; } else{ x += dx; } if(y == l.getHeight()-radius) dx *= xFriction; if (Math.abs(dx) < .9){ dx = 0; } if (y > l.getHeight() -radius){ y = l.getHeight() -radius; dy *= energyloss; dy = - dy; }else{ //velocity formula dy = dy + gravity *dt; //position formula y += dy*dt + .5*gravity*dt*dt; } } public void paint(Graphics g){ g.setColor(Color.RED); g.fillOval(x-radius, y-radius, radius*2, radius*2); }

}

Finalmente la clase que inicializa el nivel.

import javax.swing.JFrame; public class Frame { public static void main(String[] args){ JFrame frame = new JFrame("Hard as Snails"); frame.add(new Level()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1280,720); frame.setVisible(true); }

}

¿Podría alguien ayudarme en lo que estoy haciendo mal aquí? También soy bastante nuevo en este nivel de codificación, así que explíquelo como si estuviera hablando con un idiota. ¡Muchas gracias por tu tiempo!