Java - Ayuda con una NPE

 
Vista:
sin imagen de perfil
Val: 82
Ha disminuido su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Ayuda con una NPE

Publicado por System.out.println("Me llamo Carlos") (43 intervenciones) el 15/07/2020 20:51:43
Hola buenas, estoy haciendo un ejercicio de swing, pero me sale una Null pointer exeption, la verdad es que no detecto que variable tiene valor nullo, ayudarme por favor...

Os dejo todas las clases para ver si detectais el error:

1
2
3
4
5
6
7
8
9
10
11
package creador_mensajes;
 
public class MainCreador {
 
	public static void main(String[] args) {
 
		FrameCreador f = new FrameCreador();
 
	}
 
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package creador_mensajes;
 
import javax.swing.JFrame;
 
public class FrameCreador extends JFrame {
 
	public FrameCreador() {
 
		setTitle("Creador de mensajes");
 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
		setBounds(480, 200, 500, 500);
 
		setResizable(false);
 
		add(new PanelPrinicipal());
 
		setVisible(true);
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package creador_mensajes;
 
import java.awt.BorderLayout;
 
import javax.swing.JButton;
import javax.swing.JPanel;
 
public class PanelPrinicipal extends JPanel {
 
	JButton crearMensajeButton;
 
	public PanelPrinicipal() {
 
		JPanel panelBotton = new JPanel();
 
		//TODO El boton ponerle la accion
 
		crearMensajeButton = new JButton(new AccionMensaje());
 
		// ------------------------------------------------------
 
		setLayout(new BorderLayout());
 
		// ------------------------------------------------------
 
		panelBotton.add(crearMensajeButton);
 
		add(new PanelCentro(), BorderLayout.CENTER);
		add(panelBotton, BorderLayout.SOUTH);
 
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package creador_mensajes;
 
import java.awt.GridLayout;
import javax.swing.JPanel;
 
public class PanelCentro extends JPanel {
 
	private static PanelJRadio Tipo;
	private static PanelJRadio TipoDeMensaje;
	private static PanelJRadio Mensaje;
	private static PanelJRadio Confirmar;
	private static PanelJRadio Opcion;
	private static PanelJRadio Entrada;
 
	public PanelCentro() {
 
		setLayout(new GridLayout(2, 3));
 
		String[] tipo = { "Mensaje", "Confirmar", "Opcion", "Entrada" };
		String[] tipoDeMensaje = { "ERROR_MESSAGE", "INFORMATION_MESSAGE", "WARNING_MESSAGE", "QUESTION_MESSAGE",
				"PLAIN_MESSAGE" };
		String[] mensaje = { "Cadena", "Icono", "Componente", "Otros", "Object[]" };
		String[] confirmar = { "DEFAULT_OPTION", "YES_NO_OPTION", "YES_NO_CANCEL_OPTION", "0K_CANCEL_OPTION" };
		String[] opcion = { "String[]", "Icon[]", "Object[]" };
		String[] entrada = { "Campo de texto", "Combo" };
 
		Tipo = new PanelJRadio("Tipo", tipo);
		TipoDeMensaje = new PanelJRadio("Tipo de Mensaje", tipoDeMensaje);
		Mensaje = new PanelJRadio("Mensaje", mensaje);
		Confirmar = new PanelJRadio("Confirmar", confirmar);
		Opcion = new PanelJRadio("Opcion", opcion);
		Entrada = new PanelJRadio("Entrada", entrada);
 
		add(Tipo);
		add(TipoDeMensaje);
		add(Mensaje);
		add(Confirmar);
		add(Opcion);
		add(Entrada);
	}
 
	public static PanelJRadio getTipo() {
		return Tipo;
	}
 
	public static PanelJRadio getTipoDeMensaje() {
		return TipoDeMensaje;
	}
	public static PanelJRadio getMensaje() {
		return Mensaje;
	}
 
	public static PanelJRadio getConfirmar() {
		return Confirmar;
	}
 
	public static PanelJRadio getOpcion() {
		return Opcion;
	}
 
	public static PanelJRadio getEntrada() {
		return Entrada;
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package creador_mensajes;
 
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
 
public class PanelJRadio extends JPanel {
 
	private ButtonGroup group;
 
	public PanelJRadio(String titulo, String[] opciones) {
 
		setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), titulo));
 
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
 
		group = new ButtonGroup();
 
		for (int i = 0; i < opciones.length; i++) {
 
			JCheckBox box = new JCheckBox(opciones[i]);
 
			add(box);
 
			group.add(box);
 
			box.setSelected(i == 0);
 
		}
 
	}
 
	public String dameElBotonSelecionado () {
 
		String i = group.getSelection().getActionCommand();
 
		return i;
	}
 
}

En el método ActionPerformed, cuando descomento el if, el NPE, desaparece.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package creador_mensajes;
 
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
 
public class AccionMensaje extends AbstractAction {
 
	public AccionMensaje() {
 
		putValue(AbstractAction.NAME, "Crear mensaje");
		putValue(AbstractAction.SHORT_DESCRIPTION,
				"Un boton que al clicarlo te crea un mensaje con los parametros seleccionados");
	}
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
		PanelJRadio tipo = PanelCentro.getTipo();
		PanelJRadio tipoDeMensaje = PanelCentro.getTipoDeMensaje();
		PanelJRadio mensaje = PanelCentro.getMensaje();
		PanelJRadio confirmar = PanelCentro.getConfirmar();
		PanelJRadio opcion = PanelCentro.getOpcion ();
		PanelJRadio entrada = PanelCentro.getEntrada();
 
		if (tipo.dameElBotonSelecionado().equals("Mensaje")) {
 
			//Cuando descomento el if no me sale la "NPE"
 
			System.out.println("FUNCIONA!");
       }
 
		//TODO:Poner todas las opciones posibles...
 
	}
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con una NPE

Publicado por Rodrigo (622 intervenciones) el 16/07/2020 15:36:34
Sugiero copiar la excepcion completa, o al menos las primeras lineas de esta. Generalmente muestra el stacktrace con clases y numeros de lineas.

Pregunta: por que PanelCentro tiene todos los miembros y metodos static?
Si no creas nunca un objeto de este tipo, el constructor no se ejecuta nunca, y por lo tanto todos los miembros static no han sido inicializados, por lo que en el actionPerformed todas las asignaciones que haces deberian ser null.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 82
Ha disminuido su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Ayuda con una NPE

Publicado por System.out.println("Me llamo Carlos") (43 intervenciones) el 16/07/2020 22:32:43
1. Para que en action performed, al darle un valor a las variables locales, me ahorre el tener que instanciar un objeto de tipo PanelCentro.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at creador_mensajes.AccionMensaje.actionPerformed(AccionMensaje.java:27)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con una NPE

Publicado por Kabuto (982 intervenciones) el 17/07/2020 01:28:09
Tu aquí instancias un objeto (desreferenciado) PanelCentro

1
add(new PanelCentro(), BorderLayout.CENTER);

Vale, pero dicho objeto, no tiene ninguna relación con la llamada estática que haces de PanelCentro en el actionPerformed:

1
2
3
4
5
6
7
8
public void actionPerformed(ActionEvent e) {
 
    PanelJRadio tipo = PanelCentro.getTipo();
    PanelJRadio tipoDeMensaje = PanelCentro.getTipoDeMensaje();
    PanelJRadio mensaje = PanelCentro.getMensaje();
    PanelJRadio confirmar = PanelCentro.getConfirmar();
    PanelJRadio opcion = PanelCentro.getOpcion ();
    PanelJRadio entrada = PanelCentro.getEntrada();

Tu idea no sirve.
Tienes que referenciar el objeto PanelCentro, y hacerle llegar esa referencia al actionPerformed, por ejemplo, a través del constructor de la clase AccionMensaje.
Como ya tendrías referencia al objeto instanciado, ya no has de usar métodos ni atributos static

Prueba con los siguientes cambios que marco en negrita:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class AccionMensaje extends AbstractAction {
 
        private PanelCentro panelCentro;
 
	public AccionMensaje(PanelCentro panelCen) {
                panelCentro = panelCen; //Referencia al objeto PanelCentro
		putValue(AbstractAction.NAME, "Crear mensaje");
		putValue(AbstractAction.SHORT_DESCRIPTION,
				"Un boton que al clicarlo te crea un mensaje con los parametros seleccionados");
	}
 
	@Override
	public void actionPerformed(ActionEvent e) {
 
                //Los siguientes métodos a los que llamamos mediante la referencia, han de dejar de ser static
		PanelJRadio tipo = panelCentro.getTipo();
		PanelJRadio tipoDeMensaje = panelCentro.getTipoDeMensaje();
		PanelJRadio mensaje = panelCentro.getMensaje();
		PanelJRadio confirmar = panelCentro.getConfirmar();
		PanelJRadio opcion = panelCentro.getOpcion ();
		PanelJRadio entrada = panelCentro.getEntrada();
 
		if (tipo.dameElBotonSelecionado().equals("Mensaje")) {
 
			//Cuando descomento el if no me sale la "NPE"
 
			System.out.println("FUNCIONA!");
       }
 
		//TODO:Poner todas las opciones posibles...
 
	}
 
}

Y en PanelPrincipal, el objeto PanelCentro lo instancias referenciado, para pasarle esa referencia a la instancia de AccionMensaje

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class PanelPrinicipal extends JPanel {
 
	JButton crearMensajeButton;
        PanelCentro panelCentro = new PanelCentro(); //Instancia referenciada
 
	public PanelPrinicipal() {
 
		JPanel panelBotton = new JPanel();
 
		//TODO El boton ponerle la accion
 
		crearMensajeButton = new JButton(new AccionMensaje(panelCentro));//AccionMensaje recibe referencia por constructor
 
		// ------------------------------------------------------
 
		setLayout(new BorderLayout());
 
		// ------------------------------------------------------
 
		panelBotton.add(crearMensajeButton);
 
		add(panelCentro, BorderLayout.CENTER);//Añadimos la referencia al panelCentro
		add(panelBotton, BorderLayout.SOUTH);
 
	}
}


Comprueba a ver si con esos cambios te funciona el programa. Sobre todo recuerda modificar la clase PanelCentro para que sus métodos y atributos ya no sean static
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con una NPE

Publicado por Rodrigo (622 intervenciones) el 17/07/2020 01:54:49
Algo menor que tal vez tambien quieres corregir:

renombrar la clase "PanelPrinicipal" a "PanelPrincipal"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar