elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Duda con interfaces gráficas en Java.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con interfaces gráficas en Java.  (Leído 3,571 veces)
niano

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Duda con interfaces gráficas en Java.
« en: 6 Septiembre 2019, 16:58 pm »

Hola.

He tenido una pequeña sorpresa programando interfaces gráficas con Java. He simplificado el código manteniendo el problema para que se haga más sencilla su comprensión. Tenemos una clase Prueba2 que extiende un JFrame:

Código
  1. package prueba2;
  2. import java.awt.event.WindowAdapter;
  3. import java.awt.event.WindowEvent;
  4. import java.io.IOException;
  5. import javax.swing.JFrame;
  6. public class Prueba2 extends JFrame   {
  7.    private PanelPrueba Juego;
  8.    public Prueba2() throws IOException{
  9.        Juego=new PanelPrueba();
  10.        getContentPane().add(Juego);
  11.        addWindowListener(new WindowAdapter(){
  12.            public void windowClosing(WindowEvent e){
  13.                System.exit(0);
  14.            }
  15.        });
  16.       Juego.setVisible(true);
  17. }
  18.    public static void main(String[] args) throws IOException {
  19.        Prueba2 J=new Prueba2();
  20.        J.setBounds(0, 0, 400, 400);
  21.        J.setVisible(true);
  22.    }
  23. }
  24.  

Y otra clase PanelPrueba, que extiende un JPanel e implementa un KeyListener:

Código
  1. package prueba2;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.event.KeyEvent;
  6. import java.awt.event.KeyListener;
  7. import static javax.swing.JOptionPane.PLAIN_MESSAGE;
  8. import static javax.swing.JOptionPane.YES_NO_OPTION;
  9. import static javax.swing.JOptionPane.YES_OPTION;
  10. import static javax.swing.JOptionPane.showConfirmDialog;
  11. import javax.swing.JPanel;
  12.  
  13. public class PanelPrueba extends JPanel implements KeyListener {
  14.    public PanelPrueba(){
  15.        setBounds(0,0,200,500);
  16.        addKeyListener(this);
  17.        setFocusable(true);
  18.        requestFocus();
  19. }
  20.    public void paint(Graphics g){
  21.        g.setColor(Color.WHITE);
  22.        g.fillRect(0, 0, 200, 500);
  23.    }
  24.    public void reiniciar() {
  25.        repaint();
  26.    }
  27.    @Override
  28.    public void keyTyped(KeyEvent que) {}
  29.  
  30.    @Override
  31.    public void keyPressed(KeyEvent que)  {
  32.        if(showConfirmDialog(this,"Has ganado,deseas empezar otra partida?","Fin de Partida",YES_NO_OPTION,PLAIN_MESSAGE)==YES_OPTION){
  33.            reiniciar();
  34.        }  
  35.        else{
  36.           System.exit(0);
  37.        }
  38.    }
  39.  
  40.    @Override
  41.    public void keyReleased(KeyEvent que) {}
  42. }

Básicamente lo que pasa cuando aprietas una tecla es que te sale un cuadro de diálogo con dos botones. Si se pulsa "No" la aplicación finaliza y si se pulsa "Sí" vuelve a la situación inicial. La sorpresa está en que si se pulsa "Sí" aparece un molesto texto detrás del JPanel. ¿Alguien sabría explicarme por qué pasa eso, y cómo se puede solucionar el problema?

He estado probando cosas, y si el cuadro de diálogo haces que aparezca con un showMessageDialog en lugar de con un showConfirmDialog el problema desaparece.

Por otro lado, si hago que la clase PanelPrueba extienda un Canvas en lugar de un JPanel el problema desaparece. No obstante, quisiera solucionar el problema con un JPanel, ya que éste es el "peso pesado" de los contenedores, y aporta muchas ventajas, ¿verdad?  ;)

También me gustaría comentar que me han pasado cosas parecidas cuando he añadido objetos de clases JPanel y JButton a un mismo JFrame, y que estos problemas han desaparecido igualmente utilizando Canvas.

Agradezco de antemano cualquier tipo de ayuda o comentario y el tiempo que os haya tomado atenderme.

Un saludo a todos.


En línea

niano

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: Duda con interfaces gráficas en Java.
« Respuesta #1 en: 16 Mayo 2020, 20:36 pm »

Hola.

Hace unos días solucioné el problema. Se trataba de incluir la línea setLayout(null); en el constructor del JFrame.

No entiendo muy bien por qué esa línea soluciona el problema. ¿A alguien se le ocurre por qué?

Me llama la atención especialmente que el error sólo ocurría en máquinas con Windows, lo he comprobado en dos diferentes. Sin embargo en máquinas con Mac el problema, según parece, no tenía lugar. Pero, ¿no se suponía que con el JPanel y el JFrame no dependían del sistema y que eso era una ventaja sobre el Canvas y el Frame?

Si alguien sabe algo sobre lo que pasa aquí me encantaría que me iluminase un poco. Supongo que ya se ve que estoy un poco verde en el tema y quizás no sea fácil explicármelo, pero estaría muy interesado en aprender algo al respecto.

Gracias de antemano. Un saludo.


En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Duda con interfaces gráficas en Java.
« Respuesta #2 en: 17 Mayo 2020, 17:44 pm »

Hola.

Hace unos días solucioné el problema. Se trataba de incluir la línea setLayout(null); en el constructor del JFrame.

No entiendo muy bien por qué esa línea soluciona el problema. ¿A alguien se le ocurre por qué?

Me llama la atención especialmente que el error sólo ocurría en máquinas con Windows, lo he comprobado en dos diferentes. Sin embargo en máquinas con Mac el problema, según parece, no tenía lugar. Pero, ¿no se suponía que con el JPanel y el JFrame no dependían del sistema y que eso era una ventaja sobre el Canvas y el Frame?

Si alguien sabe algo sobre lo que pasa aquí me encantaría que me iluminase un poco. Supongo que ya se ve que estoy un poco verde en el tema y quizás no sea fácil explicármelo, pero estaría muy interesado en aprender algo al respecto.

Gracias de antemano. Un saludo.


Bueno mira, respondiendo una parte de tu pregunta, seguro es incompatibilidad del Layout, porque el único Layout multiplataforma es el,

GroupLayout

Entonces como lo seteas a null, pues quizá este la cosa por ahi.

saludos.
« Última modificación: 17 Mayo 2020, 17:46 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
niano

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: Duda con interfaces gráficas en Java.
« Respuesta #3 en: 19 Mayo 2020, 23:13 pm »

Hola.

Antes de nada muchas gracias por responder, rub'n.


Bueno mira, respondiendo una parte de tu pregunta, seguro es incompatibilidad del Layout, porque el único Layout multiplataforma es el,

GroupLayout

Entonces como lo seteas a null, pues quizá este la cosa por ahi.


Mmmm... No sé si te he entendido bien. Resulta que el problema desapareció precisamente cuando metí la línea setLayout(null) al principio del constructor de la clase que extiende el JFrame, ¿dices que mejor haber hecho algo con un GroupLayout?

Un saludo y gracias.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cómo crear interfaces gráficas con Look And Feel en Java « 1 2 »
Java
Casidiablo 15 67,733 Último mensaje 11 Diciembre 2011, 19:58 pm
por jorgemora
[SOLUCIONADO]Ayuda Con Interfaces Graficas?
Java
monsefoster 6 5,936 Último mensaje 21 Febrero 2010, 08:51 am
por Leyer
Desarrollo de Aplicaciones con Interfaces Graficas?
Programación C/C++
joelmanx 2 2,690 Último mensaje 15 Octubre 2010, 19:15 pm
por joelmanx
Interfaces gráficas
Scripting
Eleкtro 0 2,493 Último mensaje 12 Marzo 2012, 10:39 am
por Eleкtro
Ayuda con interfaces gráficas en C++
Programación C/C++
juaniyoalm 4 3,124 Último mensaje 7 Marzo 2019, 19:43 pm
por juaniyoalm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines