Autor Tema: Java calculadora con método gráfico e imprimir a archivo txt ejemplo código  (Leído 346 veces)

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
¿Qué tal? Esto es una de rutina y consiste en lo siguiente, tengo las clases:


Código: [Seleccionar]
public class ClsFraccion
{
//Atributos
private int numerador;
private int denominador;
private String resultado;
;
//Constructores
public ClsFraccion() {
numerador=0;
denominador=0;
}

public ClsFraccion(int n, int d) {
numerador=n;
denominador=d;
}



public ClsFraccion(ClsFraccion q) {
this.numerador=q.numerador;
this.denominador=q.denominador;
}

//getters y setters
public String getResultado() {
return resultado;
}

public void setResultado(String resultado) {
this.resultado = resultado;
}
public int getNumerador() {
return numerador;
}

public void setNumerador(int numerador) {
this.numerador = numerador;
}

public int getDenominador() {
return denominador;
}

public void setDenominador(int denominador) {
this.denominador = denominador;
}

//Metodos-Operaciones
    public static int mcdRecursivo(int numerador, int denominador){
        if(denominador == 0) {
            return numerador;
        }else {
            return mcdRecursivo(denominador, (numerador%denominador));
        }
    }
public ClsFraccion mul(ClsFraccion p, ClsFraccion q) { //mul en lugar de "por"

ClsFraccion r=new ClsFraccion();
r.denominador=(p.denominador*q.denominador);
r.numerador=(p.numerador*q.numerador);
return r;
}

public ClsFraccion suma(ClsFraccion p, ClsFraccion q) {

ClsFraccion r = new ClsFraccion();
r.setDenominador(p.denominador*q.denominador);
r.setNumerador((p.numerador*q.denominador)+(p.denominador*q.numerador));
return r;
}



public ClsFraccion resta(ClsFraccion p, ClsFraccion q) { 

ClsFraccion r = new ClsFraccion();
r.setDenominador(p.denominador*q.denominador);
r.setNumerador((p.numerador*q.denominador)-(p.denominador*q.numerador));
return r;
}

public ClsFraccion division(ClsFraccion p, ClsFraccion q) {

ClsFraccion r=new ClsFraccion();
r.setDenominador(p.denominador*q.numerador);
r.setNumerador(p.numerador*q.denominador);
return r;
}

public void Simplificar() {
int divisor=2;
while(numerador>=divisor && denominador>=divisor) {
while(numerador%divisor==0 && denominador%divisor==0) {
numerador/=divisor;
denominador/=divisor;
}
divisor+=1;
}
}
public String Imprimir() {
resultado=(numerador+"/"+denominador);
return resultado;
}

public String respuesta() {
String q="";

Simplificar();
if(numerador>denominador) {
q+=(numerador/denominador)+" ";
}
q+=(numerador%denominador)+"/"+denominador;

return q;
}

public double valor() {
return (double)numerador/denominador;
}

}


Código: [Seleccionar]
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public final class Calculadora extends JFrame implements ActionListener {

JLabel eti1, guion1, guion2, ig, guion3, txtresn, txtresd;
JTextField txtvalores, txtnum1, txtden1, txtnum2, txtden2;
JButton BtnSuma, BtnResta, BtnMulti, BtnDiv, BtnIgual, BtnNumerador, BtnDenominador, BtnDEL, BtnDecimal,BtnGuardar,BtnAbrir;
JPanel panel;
JFileChooser seleccionar= new JFileChooser();
File archivo;
FileInputStream entrada;
FileOutputStream Salida;
byte[] bytesImg;
Calculadora(){

eti1 = new JLabel("Calculadora de Fracciones");
eti1.setBounds(128, 35, 200, 10);

//txtvalores = new JTextField();
//txtvalores.setBounds(58, 70, 280, 20);

txtnum1 = new JTextField();
txtnum1.setBounds(130, 60, 20, 20);

guion1= new JLabel("_");
guion1.setBounds(130, 70, 30, 20);

txtden1= new JTextField();
txtden1.setBounds(130, 90, 20, 20);

txtnum2 = new JTextField();
txtnum2.setBounds(160, 60, 20, 20);

guion2= new JLabel("_");
guion2.setBounds(160, 70, 30, 20);

txtden2= new JTextField();
txtden2.setBounds(160, 90, 20, 20);

ig= new JLabel("=");
ig.setBounds(190, 76, 20, 20);

txtresn= new JLabel();
txtresn.setBounds(210, 70, 20, 20);

txtresd= new JLabel();
txtresd.setBounds(210, 90, 20, 20);

guion3= new JLabel("_");
guion3.setBounds(210, 70, 30, 20);

BtnNumerador = new JButton("Num");
BtnNumerador.setBounds(60, 110, 90, 20);

BtnDenominador = new JButton("Den");
BtnDenominador.setBounds(230, 110, 90, 20);

BtnSuma = new JButton("+");
BtnSuma.setBounds(100, 150, 60, 20);
BtnSuma.addActionListener(this);

BtnResta = new JButton("-");
BtnResta.setBounds(220, 150, 60, 20);
BtnResta.addActionListener(this);

BtnMulti = new JButton("x");
BtnMulti.setBounds(100, 200, 60, 20);
BtnMulti.addActionListener(this);

BtnDiv = new JButton("/");
BtnDiv.setBounds(220, 200, 60, 20);
BtnDiv.addActionListener(this);

BtnIgual = new JButton("=");
BtnIgual.setBounds(100, 250, 60, 20);

BtnDEL = new JButton("DEL");
BtnDEL.setBounds(220, 250, 60, 20);

BtnGuardar= new JButton("Guardar");
BtnGuardar.setBounds(140, 290, 100, 20);

BtnAbrir= new JButton("Abrir");
BtnAbrir.setBounds(180, 290, 100, 20);

panel = new JPanel();
panel.setLayout(null);

panel.add(eti1);
//panel.add(txtvalores);
panel.add(txtnum1);
panel.add(guion1);
panel.add(txtden1);
panel.add(txtnum2);
panel.add(guion2);
panel.add(txtden2);
panel.add(txtresn);
panel.add(txtresd);
panel.add(guion3);
panel.add(ig);
//panel.add(BtnNumerador);
//panel.add(BtnDenominador);
panel.add(BtnSuma);
panel.add(BtnResta);
panel.add(BtnMulti);
panel.add(BtnDiv);
//panel.add(BtnIgual);
//panel.add(BtnDEL);
panel.add(BtnGuardar);

add(panel);
setSize(400, 400);
setVisible(true);


}//cerrar calculadora


public static void main(String[] args) {
new Calculadora();
Calculadora c = new Calculadora();

}

public void actionPerformed(ActionEvent e) {
//System.out.println("A");
String sx1, sx2, sy1, sy2;
int mcd, aux;
sx1=txtnum1.getText();
sx2=txtnum2.getText();
sy1=txtden1.getText();
sy2=txtden2.getText();


ClsFraccion f1=new ClsFraccion(Integer.parseInt(sx1), Integer.parseInt(sy1));
ClsFraccion f2=new ClsFraccion(Integer.parseInt(sx2), Integer.parseInt(sy2));

ClsFraccion resultado=new ClsFraccion();
Archivo file = new Archivo();
BtnGuardar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent eventoAccion) {
GuardarArchivo(eventoAccion);
}
});
if(e.getSource()==BtnSuma) {
System.out.println("Suma");
resultado=resultado.suma(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();
}
if(e.getSource()==BtnResta) {
System.out.println("Resta");
resultado=resultado.resta(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());

txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));

}
if(e.getSource()==BtnDiv) {
System.out.println("Division");
resultado=resultado.division(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();
}
if(e.getSource()==BtnMulti) {
System.out.println("Multiplicacion");
resultado=resultado.mul(f1, f2);
mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
resultado.Imprimir();

}}


private void GuardarArchivo(ActionEvent evt) {
ClsFraccion c = new ClsFraccion();
try {
FileWriter fw = new FileWriter("Calculadora.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);

pw.print(c.getResultado());
pw.close();
bw.close();

}catch(java.io.IOException ioex) {
JOptionPane.showMessageDialog(null, ioex.toString());
}


}


public void actionPerformed1(ActionEvent e) {
// TODO Auto-generated method stub

}
}


Y en especial es esta donde empiezo con el archivo:

Código: [Seleccionar]
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;

import javax.swing.JOptionPane;

public class Archivo {
public void GuardarArchivo(ClsFraccion cls) {
try {
FileWriter fw = new FileWriter("Calculadora.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);

pw.print(""+cls.getResultado());
pw.close();
bw.close();

}catch(java.io.IOException ioex) {
JOptionPane.showMessageDialog(null, ioex.toString());
}


}
}


Ya que la Clase Calculadora ocupa método gráfico, pero lo que me importa es que el resultado lo imprima en el archivo y solo me esta creando un archivo txt con "null" de contenido  :(

Y tambien quisiera saber como puedo hacer para que lea la entrada desde otro archivo  :'(

« Última modificación: 11 de Enero 2022, 20:35 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 737
    • Ver Perfil
Re: Archivo .txt en JAVA
« Respuesta #1 en: 08 de Mayo 2021, 01:09 »
Veo varias inconsistencias.

Por ejemplo, dentro del ActionPerformed, encontramos estas líneas:

Código: [Seleccionar]
ClsFraccion resultado=new ClsFraccion();
Archivo file = new Archivo();
BtnGuardar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent eventoAccion) {
GuardarArchivo(eventoAccion);
}
});

Sobre la segunda línea, marcada en negrita:
Citar
ClsFraccion resultado=new ClsFraccion();
      Archivo file = new Archivo();
      BtnGuardar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent eventoAccion) {
            GuardarArchivo(eventoAccion);
         }
      });
Creas un nuevo objeto Archivo llamado file, pero luego parece que no haces nada con él.

Luego, la siguiente parte:

Citar
ClsFraccion resultado=new ClsFraccion();
      Archivo file = new Archivo();
      BtnGuardar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent eventoAccion) {
            GuardarArchivo(eventoAccion);
         }
      });

Al botón guardar le agregas un ActionListener, pero esto es raro porque lo haces dentro del código del actionPerformed principal.
Es decir, cada vez que se clicka un botón, añades un ActionListener al botón guardar.
Estos ActionListener se van acumulando, ya que un botón, o cualquier otro objeto Swing, puede contener varios Listener. Así que si tras pulsar, no se... 8 botones y luego se pulsa el botón Guardar, se va a ejecutar 8 veces el mismo ActionListener, ya que están agregados a dicho botón.

Lo normal sería que le añadas el ActionListener, una sola vez, y esto se haga al iniciarse la aplicación.
Si lo que pretendes es que el botón Guardar no haga nada, hasta que previamente se hayan pulsado otros botones, esto lo puedes hacer con el método setEnabled() y pasarle true o false, según si quieres activar o desactivar el botón.

Y sobre ese ActionListener que le añades, consiste en el método llamado GuardarArchivo().

Que si observamos su código, atento a la línea en negrita:
Citar
private void GuardarArchivo(ActionEvent evt) {
      ClsFraccion c = new ClsFraccion();
      try {
            FileWriter fw = new FileWriter("Calculadora.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);
            
            pw.print(c.getResultado());
            pw.close();
            bw.close();
            
         }catch(java.io.IOException ioex) {
            JOptionPane.showMessageDialog(null, ioex.toString());
         }
      
      
      }

Lo primero que hace es crear un nuevo objeto ClsFraccion, el cuál al ser nuevo, su numerador y denominador es 0. No tiene ninguna relación con los cómputos que hayas hecho anteriormente. Probablemente por eso te guarda null en el txt.


Más cosas.
En el método main principal, estás creando dos Calculadoras:
Código: [Seleccionar]
public static void main(String[] args) {
new Calculadora();
Calculadora c = new Calculadora();

}
Por lo tanto, se abren dos marcos JFrame al iniciar el programa.
No creo que sea eso lo que quieres, supongo que solo quieres una:
Código: [Seleccionar]
public static void main(String[] args) {
new Calculadora();

}

Y en el constructor de la Calculadora, sugiero que le añadas las dos líneas que marco en negrita:
Citar
      add(panel);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      setLocationRelativeTo(null);
      setVisible(true);

La primera hace que cuando cerremos el JFrame pulsando el aspa de cerrar ventana, entonces la aplicación debe terminar.
Si no lo indicamos, aunque el JFrame se cierre y ya no sea visible, en realidad el programa sigue funcionando... solo que sin un JFrame con el que poder interactuar.

La segunda línea hace que la ventana de aplicación aparezca en el centro de la pantalla, y no en una esquina.

Luego a parte, tienes un montón de imports y atributos (como un array de bytes) que no se están usando para nada y supongo que son restos de andar copiando código de otros ejemplos.


En fin, al no ser mi programa, y no tener muy claro cómo debe funcionar esto de las fracciones, no se bien como se debe arreglar para que quede correcto.

Si he podido pulirlo un poco y conseguir que ya no imprima null, aunque el resultado que se imprime no estoy seguro de si es correcto. Eso ya tendrás que revisarlo tú.

Bien, he eliminado varios import y atributos que no se usan. He dejado un par por si quizás son botones que luego quieras añadir más adelante a la interfaz, no lo se...
Por cierto, siempre recomendable (por no decir obligatorio) señalar como private los atributos de clase, a no ser que realmente necesitemos que sean public.
Marcar como private sirve, entre otras cosas, para detectar atributos que nos sobran, ya que entonces el compilador que estemos usando suele avisar de que hay atributos que no estamos dando uso.

El objeto ClsFracccion que llamas resultado, recomiendo declararlo como atributo de clase, y no como un objeto que se genera nuevo cada vez que se pulsa una acción.

Al botón Guardar, le vamos a escribir su propia clase ActionListener y se la añadiremos, una sola vez, en el constructor de la clase Calculadora.
Esta acción ejecutará el mismo código que escribiste tú en el método GuardarArchivo (ahora este método desaparece, porque se convierte directamente en un ActionListener), solo que esta vez tomará el getResultado(), del ClsFraccion llamado resultado que hemos declarado como atributo de clase.

La clase Archivo, no parece ser necesaria, al menos no tal y como está implementado el resto del código, yo ni siquiera la he añadido al proyecto que he creado.

Te dejo el código de Calculadora como lo tengo ahora, y marco en negrita los principales cambios.
Ahora ya imprime un resultado en el archivo de texto, pero no tengo claro si es un resultado correcto o no. A ver si a partir de aquí puedes seguir refinándolo.

Fíjate sobre todo que ahora el método GuardarArchivo(), se ha transformador en una clase ActionListener llamada AccionGuardar. Y que esta acción se la añadimos al botón guardar dentro del constructor de Calculadora

Citar
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public final class Calculadora extends JFrame implements ActionListener {

   private JLabel eti1, guion1, guion2, ig, guion3, txtresn, txtresd;
   private JTextField txtvalores, txtnum1, txtden1, txtnum2, txtden2;
   private JButton BtnSuma, BtnResta, BtnMulti, BtnDiv, BtnIgual, BtnNumerador, BtnDenominador, BtnDEL, BtnDecimal,BtnGuardar,BtnAbrir;
   private JPanel panel;

   private ClsFraccion resultado;


   public Calculadora(){

      resultado = new ClsFraccion();

      eti1 = new JLabel("Calculadora de Fracciones");
      eti1.setBounds(128, 35, 200, 10);

      //txtvalores = new JTextField();
      //txtvalores.setBounds(58, 70, 280, 20);

      txtnum1 = new JTextField();
      txtnum1.setBounds(130, 60, 20, 20);

      guion1= new JLabel("_");
      guion1.setBounds(130, 70, 30, 20);

      txtden1= new JTextField();
      txtden1.setBounds(130, 90, 20, 20);

      txtnum2 = new JTextField();
      txtnum2.setBounds(160, 60, 20, 20);

      guion2= new JLabel("_");
      guion2.setBounds(160, 70, 30, 20);

      txtden2= new JTextField();
      txtden2.setBounds(160, 90, 20, 20);

      ig= new JLabel("=");
      ig.setBounds(190, 76, 20, 20);

      txtresn= new JLabel();
      txtresn.setBounds(210, 70, 20, 20);

      txtresd= new JLabel();
      txtresd.setBounds(210, 90, 20, 20);

      guion3= new JLabel("_");
      guion3.setBounds(210, 70, 30, 20);

      BtnNumerador = new JButton("Num");
      BtnNumerador.setBounds(60, 110, 90, 20);

      BtnDenominador = new JButton("Den");
      BtnDenominador.setBounds(230, 110, 90, 20);

      BtnSuma = new JButton("+");
      BtnSuma.setBounds(100, 150, 60, 20);
      BtnSuma.addActionListener(this);

      BtnResta = new JButton("-");
      BtnResta.setBounds(220, 150, 60, 20);
      BtnResta.addActionListener(this);

      BtnMulti = new JButton("x");
      BtnMulti.setBounds(100, 200, 60, 20);
      BtnMulti.addActionListener(this);

      BtnDiv = new JButton("/");
      BtnDiv.setBounds(220, 200, 60, 20);
      BtnDiv.addActionListener(this);

      BtnIgual = new JButton("=");
      BtnIgual.setBounds(100, 250, 60, 20);

      BtnDEL = new JButton("DEL");
      BtnDEL.setBounds(220, 250, 60, 20);

      BtnGuardar= new JButton("Guardar");
      BtnGuardar.addActionListener(new AccionGuardar());
      BtnGuardar.setBounds(140, 290, 100, 20);

      BtnAbrir= new JButton("Abrir");
      BtnAbrir.setBounds(180, 290, 100, 20);

      panel = new JPanel();
      panel.setLayout(null);

      panel.add(eti1);
      //panel.add(txtvalores);
      panel.add(txtnum1);
      panel.add(guion1);
      panel.add(txtden1);
      panel.add(txtnum2);
      panel.add(guion2);
      panel.add(txtden2);
      panel.add(txtresn);
      panel.add(txtresd);
      panel.add(guion3);
      panel.add(ig);
      //panel.add(BtnNumerador);
      //panel.add(BtnDenominador);
      panel.add(BtnSuma);
      panel.add(BtnResta);
      panel.add(BtnMulti);
      panel.add(BtnDiv);
      //panel.add(BtnIgual);
      //panel.add(BtnDEL);
      panel.add(BtnGuardar);

      add(panel);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      setLocationRelativeTo(null);
      setVisible(true);


   }//cerrar calculadora


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

   public void actionPerformed(ActionEvent e) {
      //System.out.println("A");
      String sx1, sx2, sy1, sy2;
      int mcd, aux;
      sx1=txtnum1.getText();
      sx2=txtnum2.getText();
      sy1=txtden1.getText();
      sy2=txtden2.getText();


      ClsFraccion f1=new ClsFraccion(Integer.parseInt(sx1), Integer.parseInt(sy1));
      ClsFraccion f2=new ClsFraccion(Integer.parseInt(sx2), Integer.parseInt(sy2));

      if(e.getSource()==BtnSuma) {
         System.out.println("Suma");
         resultado=resultado.suma(f1, f2);
         mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
         txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
         txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
         resultado.Imprimir();
      }
      if(e.getSource()==BtnResta) {
         System.out.println("Resta");
         resultado=resultado.resta(f1, f2);
         mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());

         txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
         txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));

      }
      if(e.getSource()==BtnDiv) {
         System.out.println("Division");
         resultado=resultado.division(f1, f2);
         mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
         txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
         txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
         resultado.Imprimir();
      }
      if(e.getSource()==BtnMulti) {
         System.out.println("Multiplicacion");
         resultado=resultado.mul(f1, f2);
         mcd=resultado.mcdRecursivo(resultado.getNumerador(), resultado.getDenominador());
         txtresn.setText(String.valueOf(resultado.getNumerador()/mcd));
         txtresd.setText(String.valueOf(resultado.getDenominador()/mcd));
         resultado.Imprimir();

      }}


   private class AccionGuardar implements ActionListener {

      @Override
      public void actionPerformed(ActionEvent e) {
         try {
            FileWriter fw = new FileWriter("Calculadora.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);

            pw.print(resultado.getResultado());
            pw.close();
            bw.close();

         }catch(java.io.IOException ioex) {
            JOptionPane.showMessageDialog(null, ioex.toString());
         }

      }


   }
}
« Última modificación: 08 de Mayo 2021, 01:13 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".