Autor Tema: Java ¿Qué es y para qué sirve el método paintComponent(Graphics g)? ¿Invocarlo?  (Leído 9742 veces)

Wolf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Buenas a tod@s ! Tengo una duda respecto al código que comparto. ¿Por qué no funciona si lo pongo dentro (en el constructor) de public void paintComponent(Graphics g)? Solo funciona si dejo los setBounds, pero si dejo alguna otra instrucción ya no funciona. Muchas gracias.

Código: [Seleccionar]
package graficos;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class FocoEvento {

public static void main(String[] args) {
// TODO Auto-generated method stub

MarcoFoco miMarco = new MarcoFoco();

miMarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

class MarcoFoco extends JFrame{

MarcoFoco (){

setTitle("Marco Foco");

setBounds(300, 300, 600, 450);

setVisible(true);

add(new LaminaFoco());
}
}

class LaminaFoco extends JPanel{

public LaminaFoco(){

setLayout(null);

cuadro1=new JTextField();
cuadro2=new JTextField();

cuadro1.setBounds(220, 10, 150, 20);
cuadro2.setBounds(220, 50, 150, 20);

add(cuadro1);
add(cuadro2);

LanzaFocos elFoco = new LanzaFocos();
cuadro1.addFocusListener(elFoco);

}

public void paintComponent(Graphics g){

super.paintComponent(g);// Invocamos al método paintComponent de JComponent para que haga su trabajo cuando lo programagron en su día.
//En este ejemplo funcionaría igual aunque no estuviera.

//setLayout(null);

/*cuadro1=new JTextField();
cuadro2=new JTextField();

cuadro1.setBounds(220, 10, 150, 20);
cuadro2.setBounds(220, 50, 150, 20);

add(cuadro1);
add(cuadro2);

LanzaFocos elFoco = new LanzaFocos();
cuadro1.addFocusListener(elFoco);*/
}

private JTextField cuadro1;

private JTextField cuadro2;

private class LanzaFocos implements FocusListener{

@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub

}

@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub

String email = cuadro1.getText();

boolean comprobacion = false;

for(int i = 0; i<email.length(); i++){

if (email.charAt(i)=='@'){

comprobacion=true;
}
}

if(comprobacion){

System.out.println("El email es correcto");
}
else{
System.out.println("El email es incorrecto");
}

}

}
}
« Última modificación: 23 de Julio 2015, 17:51 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:DUDA JTEXTFIELD
« Respuesta #1 en: 20 de Julio 2015, 23:33 »
Hola!

No entiendo muy bien lo que quieres decir

public void paintComponent(Graphics g) es un método, no es un constructor

Cuando ejecuto el código sólo me aparece una ventana ¿qué es lo que debería aparecer?

Saludos!
« Última modificación: 23 de Julio 2015, 17:51 por César Krall »
Responsable de departamento de producción aprenderaprogramar.com

Wolf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Re:DUDA JTEXTFIELD
« Respuesta #2 en: 21 de Julio 2015, 18:48 »
Hola César Krall. Me explico, el código tal como está, va bien. El funcionamiento es una chorrada. Es un ejercicio sobre los Eventos de foco. Simplemente, pongo un texto en el cuadro y al pasar poner el foco el otro evalúa si la dirección email es correcta o no. No quiero entrar en si la evaluación del email está bien o no. Es solo un ejercicio para ver si funciona el evento. Y respecto a lo de public void paintComponent(Graphics g) tienes razón, es un método. Pero, ¿por qué no funciona si pongo el código que está comentado en el método? Gracias.

PD: Te tienen que salir dos cuadros de texto, si no sale, agranda la ventana y saldrán :-)
« Última modificación: 21 de Julio 2015, 18:52 por Wolf »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:DUDA JTEXTFIELD
« Respuesta #3 en: 23 de Julio 2015, 17:50 »
Aaaah! Así es, al agrandar la ventana ya he visto que aparecían los dos cuadros de texto. Voy a intentar responder la duda.

El método paintComponent es un método especial que es llamado cuando es necesario. Hasta cierto punto no somos nosotros quienes controlamos cuándo este método es llamado, sino que lo hace java. Algunos aspectos de la programación java y en particular aspectos relativos a interfaces gráficas son controlados por java en segundo plano.

El método paintComponent se encarga del re-pintado o re-dibujado de la interfaz en diferentes situaciones, por ejemplo al mover una ventana, al cambiar sus dimensiones, cuando hay cambios de foco, superposiciones y otras situaciones. Muchas de estas situaciones son detectadas automáticamente por java y se produce una llamada automática al método paintComponent.

El método pocas veces (casi nunca) es llamado directamente por el programador. En cambio sí suele usarse con cierta frecuencia el llamar al método repaint() para establecer el redibujado de ciertos componentes a través de código controlado por el programador (esto a su vez puede inducir una llamada en segundo plano al método paintComponent).

En el código que tú has planteado no tiene sentido establecer instrucciones como estas:

cuadro1=new JTextField();
cuadro2=new JTextField();

Si  haces esto, cada vez que se produce el redibujado se crean nuevos objetos cuadro1 y cuadro2. Cada vez que se crean, equivale a que los objetos son reiniciados, por tanto no te reconocerá un texto que existiera previamente.

En resumen, no tiene sentido reiniciar múltiples veces objetos gráficos cada vez que se produce una invocación indirecta al método paintComponent.

Dicho de otra manera: el código debe estar bien organizado y cada cosa debe ir donde debe ir. Introducirlo en otros puntos puede generar problemas.

Saludos
Responsable de departamento de producción aprenderaprogramar.com

Wolf

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 13
    • Ver Perfil
Ah vale ! Sabía ya lo que hacía el método paintComponent(Graphics g), por eso no le veía sentido a poner código ahí. Es un ejemplo que vi por Internet y decían que les funcionaba :-\ Gracias por la contestación. Un saludo.

 

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".