Foros del Web » Programación para mayores de 30 ;) » Java »

Excepción al pulsar JButton

Estas en el tema de Excepción al pulsar JButton en el foro de Java en Foros del Web. Me ha surgido un problema en un programa y no consigo entender el motivo por lo que decidí pasarme por aquí a ver si alguien ...
  #1 (permalink)  
Antiguo 14/07/2011, 03:30
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 9 meses
Puntos: 1
Excepción al pulsar JButton

Me ha surgido un problema en un programa y no consigo entender el motivo por lo que decidí pasarme por aquí a ver si alguien puede echarme una mano con ello, el problema es el siguiente.

Tengo creada una clase PanelDado que extiende a JPanel, en ella asigno una imagen de un dado mediante un ImageIcon (no se si esta es la mejor manera de hacerlo pero es la única que encontré). El problema viene en que esa imagen debe cambiar al pulsar un JButton. Tengo un método setImg que me cambia la imagen pero al llamarlo desde el manejador del JButton salta la siguiente excepción.

Cita:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Kinito.Interfaz$ManejadorTirada.actionPerformed(In terfaz.java:51)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2012)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2335)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:404)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:253)
at java.awt.Component.processMouseEvent(Component.jav a:6268)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3267)
at java.awt.Component.processEvent(Component.java:603 3)
at java.awt.Container.processEvent(Container.java:204 5)
at java.awt.Component.dispatchEventImpl(Component.jav a:4629)
at java.awt.Container.dispatchEventImpl(Container.jav a:2103)
at java.awt.Component.dispatchEvent(Component.java:44 55)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4633)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4297)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4227)
at java.awt.Container.dispatchEventImpl(Container.jav a:2089)
at java.awt.Window.dispatchEventImpl(Window.java:2517 )
at java.awt.Component.dispatchEvent(Component.java:44 55)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectio nPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 619)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:138)
He comprobado que el método funciona ya que al llamarlo desde la clase en la que instancio el PanelDado funciona sin problemas. ¿Alguien sabe cual puede ser el motivo? Si necesitáis que ponga alguna parte del código concreta decírmelo y la subo.

Saludos y muchas gracias.
  #2 (permalink)  
Antiguo 14/07/2011, 04:20
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 4 meses
Puntos: 41
Respuesta: Excepción al pulsar JButton

java.lang.NullPointerException
Estás intentando acceder a un objeto nulo, uno de los errores mas común en programadores Java Juniors
__________________
BadProgrammerException!
  #3 (permalink)  
Antiguo 14/07/2011, 04:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Excepción al pulsar JButton

en concreto, en esta línea de este fichero

In terfaz.java:51
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 14/07/2011, 07:01
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Excepción al pulsar JButton

Gracias por las respuestas.

Entiendo lo que quiere decir la excepción pero lo que no acabo de entender es por qué el objeto es nulo si llamo a la función desde el manejador del JButton pero no lo es si lo llamo desde otro sitio.
  #5 (permalink)  
Antiguo 14/07/2011, 08:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Excepción al pulsar JButton

Pon algo de código e indica claramente cual es esa línea concreta. Si no, va a ser difícil decirte algo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #6 (permalink)  
Antiguo 14/07/2011, 12:50
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Excepción al pulsar JButton

Aquí dejo el código, he dejado solo lo importante y he comentado donde da el error al hacer la llamada y donde no lo da

Código:
public class Interfaz extends JFrame{	
	...
	public Interfaz(){
		...
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(0,2));
		PanelDado p1 = new PanelDado();
		panel.add(p1);
		p1.setImg(); //Funciona
		...	
		tirar.addActionListener(new ManejadorTirada());
	}

	class ManejadorTirada implements ActionListener{
		public void actionPerformed(ActionEvent e){
			p1.setImg(); //No Funciona, es donde lanza la excepción
		}
	}
}
  #7 (permalink)  
Antiguo 14/07/2011, 13:42
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Excepción al pulsar JButton

bueno, en el constructor, donde funciona, tienes una variable local al metodo PanelDado p1 y le haces un new. Dentro de Manejador usas p1, pero p1 no es visible desde ahí, ya que p1 es local al constructor y sólo se ve en el constructor.

Como te compila, supongo que la lcase Interfaz tiene en algún sitio un atributo p1 al que no le haces un new y ese es el que estás viendo dentro del Manejador Tirada

Código java:
Ver original
  1. public class Interfaz extends JFrame{  
  2.         ...
  3.         PanelDado p1;  // Seguramente tienes uno de estos que no inicializas.
  4.     ...
  5.     public Interfaz(){
  6.         ...
  7.         JPanel panel = new JPanel();
  8.         panel.setLayout(new GridLayout(0,2));
  9.         PanelDado p1 = new PanelDado();
  10.         panel.add(p1);
  11.         p1.setImg(); //Funciona
  12.         ...
  13.         tirar.addActionListener(new ManejadorTirada());
  14.     }
  15.  
  16.     class ManejadorTirada implements ActionListener{
  17.         public void actionPerformed(ActionEvent e){
  18.             p1.setImg(); //No Funciona, es donde lanza la excepción
  19.         }
  20.     }
  21. }

para arreglarlo, quita el tipo PaneDado del constructor (deja el p1=new PanelDado()

Código java:
Ver original
  1. public class Interfaz extends JFrame{  
  2.         ...
  3.         PanelDado p1;  // Seguramente tienes uno de estos que no inicializas.
  4.     ...
  5.     public Interfaz(){
  6.         ...
  7.         JPanel panel = new JPanel();
  8.         panel.setLayout(new GridLayout(0,2));
  9.         p1 = new PanelDado();       // Déjalo así, sin el tipo delante.
  10.         panel.add(p1);
  11.         p1.setImg(); //Funciona
  12.         ...
  13.         tirar.addActionListener(new ManejadorTirada());
  14.     }
  15.  
  16.     class ManejadorTirada implements ActionListener{
  17.         public void actionPerformed(ActionEvent e){
  18.             p1.setImg(); //No Funciona, es donde lanza la excepción
  19.         }
  20.     }
  21. }

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #8 (permalink)  
Antiguo 14/07/2011, 14:20
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Excepción al pulsar JButton

Es pa matarme jajaja

Muchas gracias chuidiang si no es por ti no me doy cuenta del error en la vida!

Etiquetas: pulsar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:29.