Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Wolf en 20 de Julio 2015, 18:58
-
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.
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");
}
}
}
}
-
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!
-
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 :-)
-
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
-
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.