[ Foro de Java ]

Problema con variablea

05-Jun-2021 11:02
Invitado (Pedro Cristos )
2 Respuestas

Tengo un problema con las variable, quiero gestionar las fotos (con la variable foto) para que con el botón avanzar y retroceder cambiar una foto (ya que son muchas fotos y están numeradas del 1 al 66) pero me aparecen estos errores:

Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.(Unknown Source)
at paqueteJava.VentanaInicial.(VentanaInicial.java:126)
at paqueteJava.VentanaInicial.main(VentanaInicial.java:176)


No se que hacer. Por cierto mi profesor de TIC enseña fatal


package paqueteJava;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
public class VentanaInicial {
JFrame ventanaInicio= new JFrame("Ce 78 App");
//Inicio
JLabel titulo= new JLabel();
JLabel autor= new JLabel();
JLabel articulo= new JLabel();
JButton botApuntes=new JButton();
JButton botExamen=new JButton();
JButton botInfo=new JButton();
JPanel Inicio= new JPanel();
JPanel marPrincipalTituloAutor= new JPanel();
JPanel marPrincipalBotones= new JPanel();
JPanel marBotones= new JPanel();
JPanel marBotones1= new JPanel();
JPanel marArticulo= new JPanel();
JPanel Espacio= new JPanel();
JPanel marTitulo= new JPanel();
JPanel marAutor= new JPanel();
JPanel marInfo= new JPanel();
Font fuente = new Font("Arial",1,13);
String texto;
//Apuntes
JButton Volver=new JButton();
JButton Avanzar=new JButton();
JLabel Foto= new JLabel();
JPanel Apuntes= new JPanel();
JPanel marControl= new JPanel();
JPanel marFoto= new JPanel();
double resultado=1;
double foto=0;
double uno=1;
public VentanaInicial() {
//Características
ventanaInicio.setPreferredSize(new Dimension(1200,900));
ventanaInicio.setExtendedState(ventanaInicio.MAXIMIZED_BOTH);
ventanaInicio.setMinimumSize(ventanaInicio.getPreferredSize());
ventanaInicio.setLocationRelativeTo(null);
ventanaInicio.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//ventanaInicio.setBounds(800,800,700,700);

titulo.setText("Ce 78 App");
titulo.setFont(new Font("Arial",3,60));
titulo.setForeground(Color.BLACK);
titulo.setHorizontalAlignment(JTextField.CENTER);
titulo.setHorizontalAlignment(Label.RIGHT);

autor.setText("Por Pedro Cristos Martinez");
autor.setFont(new Font("Arial",0,20));
autor.setForeground(Color.BLACK);
autor.setHorizontalAlignment(JTextField.CENTER);

texto="<html>


DON JUAN CARLOS I</html>";
articulo.setText(texto);
articulo.setFont(fuente);


botExamen.setIcon(new ImageIcon(getClass().getResource("Aceptar.gif")));
botExamen.setText("Acceso a examen");
botExamen.setPreferredSize(new Dimension (200,40));
botExamen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

Inicio.setVisible(false);
//ventanaInicio.add();




}
}
);
//Examen

botApuntes.setIcon(new ImageIcon(getClass().getResource("Derecha.gif")));
botApuntes.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
botApuntes.setText("Acceso a apuntes");
botApuntes.setPreferredSize(new Dimension (200,40));
botApuntes.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){

Inicio.setVisible(false);
ventanaInicio.add(Apuntes);
Foto.setIcon(new ImageIcon(getClass().getResource("25.png")));



}
}
);
//Apuntes
Volver.setIcon(new ImageIcon(getClass().getResource("Izquierda.gif")));
Volver.setText("Volver al menu");
Volver.setPreferredSize(new Dimension (200,40));
Volver.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
foto=resultado-uno;


}
}
);


Avanzar.setIcon(new ImageIcon(getClass().getResource("Derecha.gif")));
Avanzar.setText("Siguiente lección");
Avanzar.setPreferredSize(new Dimension (200,40));
Avanzar.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){

foto=resultado+uno;

//if (foto>=)

}
}
);

Foto.setHorizontalAlignment(JTextField.CENTER);
Foto.setIcon(new ImageIcon(getClass().getResource(foto+".png")));

//botInfo.setIcon(new ImageIcon(getClass().getResource("")));
botInfo.setText("Info");
botInfo.setPreferredSize(new Dimension (80,40));
//botInfo.addActionListener( new ());


//Montaje INICIO:
marBotones.setLayout(new BorderLayout());
marBotones.add("Center",botApuntes);
marBotones.add("South",botExamen);
marBotones1.setLayout(new FlowLayout(FlowLayout.LEFT));
marBotones1.add(marBotones);
marTitulo.setLayout(new FlowLayout(FlowLayout.LEFT));
marTitulo.add(titulo,("Sup.1"));
marInfo.setLayout(new BorderLayout());
marInfo.add("South",botInfo);
marArticulo.add(articulo);
marAutor.setLayout(new FlowLayout(FlowLayout.LEFT));
marAutor.add(autor);
marPrincipalTituloAutor.setLayout(new BorderLayout());
marPrincipalTituloAutor.add("Center",marTitulo);
marPrincipalTituloAutor.add("South",marAutor);
marPrincipalBotones.add(marBotones1);
marPrincipalBotones.add(marArticulo);
marPrincipalBotones.add(marInfo);
Inicio.setLayout(new BorderLayout());
Inicio.setBorder(BorderFactory.createEmptyBorder(2,30,20,20));
Inicio.add("North",marPrincipalTituloAutor);
Inicio.add("Center",marArticulo);
Inicio.add("South",marPrincipalBotones);
ventanaInicio.add(Inicio);
ventanaInicio.setResizable(true);
ventanaInicio.setVisible(true);
//Montaje
marControl.setLayout(new FlowLayout(FlowLayout.CENTER));
marControl.add(Volver);
marControl.add(Espacio);
marControl.add(Avanzar);
marFoto.add(Foto);
Apuntes.setBorder(BorderFactory.createEmptyBorder(2,30,20,20));
Apuntes.setLayout(new BorderLayout());
Apuntes.add("North",marControl);
Apuntes.add("Center",marFoto);



}
public static void main(String[] args) {
new VentanaInicial();

}

}


08-Jun-2021 04:45
Franco Garcia

En esta linea de codigo tenes el problema:

botExamen.setIcon(new ImageIcon(getClass().getResource("Aceptar.gif")));

en la linea de codigo 126... NO ESTA encontrando el archivo "Aceptar.gif", por eso te lo esta marcando como null (osea, ImageIcon NO esta apuntando a ningun lado, al no encontrar el archivo)
REVISA la ruta y fijate que el archivo este bien (el nombre y la extension esten bien escritos)

Espero haber sido de ayuda. Comentame si lo pudiste solucionar. Slds y exitos.

P.D: La mayoria enseña asi, Swing lo aprendi bien por medios propios, entrando en foros y viendo videos por youtube, pero me sorprendio la cantidad de cosas que en la facultad no explican bien y nisiquiera vez...
La gran mayoria, repite codigo como loros y no entienden lo que hacen. Por lo menos hablo de la experiencia mia en la facultad y con mis compañeros, para aprender bien, tenes que sentarte y ponerte a buscar cosas por tu cuenta en tu tiempo libre, ademas de hacerte de amigos que tengan este rasgo igual que tu, y entre ustedes se comparten cosas o se enseñan. Juntate con la gente que realmente quiera aprender y no solo pasar un examen.


08-Jun-2021 05:21
Franco Garcia

Ahi copie el codigo y lo revise un poco mas, NO ESTA ENCONTRANDO NINGUNA DE LAS IMAGENES

//Avanzar.setIcon(new ImageIcon(getClass().getResource("Derecha.gif")));

//Volver.setIcon(new ImageIcon(getClass().getResource("Izquierda.gif")));

etc

TENES MAL LAS  RUTAS (todas) en donde esta buscando los archivos, te recomiendo que le agregues al proyecto una carpeta de recursos y los metas ahi, o crea un package (una carpeta) y metes los archivos ahi y fijate de escribir bien la ruta.

COMO ESCRIBIR RUTAS: (y algo sobre los paquetes)

los packages SON CARPETAS en donde estan metidos nuestros archivos (.java), tembien podemos meter
otros archivos, como imagenes en tu caso.

Yo copie tu codigo en un package (carpeta) que se llama "problemas_con_fotos"
la ruta en java es:  src/problema_con_fotos/Main.java --> aca meti el .java con el main

cree 2 carpetas, una para poner el .java de tu clase "VentanaInicial" y otro package (carpeta) que se llama "imagenes" y ahi meti el archivo arbol.jpg el cual asigen a un JLabel.

LA RUTA para acceder a esta imagen es: "/problema_con_fotos/imagenes/arbol.jpg", ACORDATE que src NO SE ESCRIBE, porque java EMPIEZA a buscar sus carpetas (packages) y archivos .java DESDE ahi
osea que  la ruta para java es"[src]/problema_con_fotos/imagenes/arbol.jpg" siendo lo que va entre [] NO SE ESCBRIBE.

Este fue el codigo que agregue para poner una imagen.

JLabel pnlFondo = new JLabel(); // creo el panel para poner la imagen.
ventanaInicio.add(pnlFondo);
ImageIcon imagen = new ImageIcon(getClass().getResource("/problema_con_fotos/imagenes/arbol.jpg"));
pnlFondo.setIcon(imagen);
pnlFondo.setSize(imagen.getIconWidth(), imagen.getIconHeight()); /* esto lo hago para darle tamanio al JLabel y que me muestre la imagen */

El resto del codigo no lo revise, pero te aconsejo que  no hagas tan aparatoso el codigo... por ejemplo, los listener los podes crear aparte en otros archivos .java y dsps agregarlos, o por ejemplo crear paneles, que contengan los JLabel y demas componentes que utilices y entonces, LA UNICA FUNCION de los paneles es crear y acomodar esos componentes, de esta forma te queda mas segmentado todo (por un lado los compnentes, por otro lado las acciones, etc) y es mas facil leer el codigo, porque tenes  muchos archivos .java con pedazos de codigo muy pequeños, osea trata de MODULAR mas tu codigo, asi no se arma algo gigantesco, que cuesta mas leer, sobre todo en un examen que te puede hacer parir encontrar un error rapido.

SLDS nuevamente.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)