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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  JFrame
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: JFrame  (Leído 9,092 veces)
nerckos

Desconectado Desconectado

Mensajes: 18


Ver Perfil
JFrame
« en: 7 Mayo 2010, 20:23 pm »

Buenas tardes a todos, me ha surgido un problemilla esta tarde con un JFrame, ya utilicé el buscar y no v nada al respecto. Mi duda es la siguiente:

Utilizo un JFrame para capturar un usuario y una contrasenya, que se conectan a un servidor a traves de un socket a una base de datos. El problema viene cuando el usuario ya es correcto, en ese momento llamo a la clase que muestra la siguiente pantalla(otro JFrame), pero me aparece en negro y con un tamanyo de 0x0 "petado".

Cual podria ser el problema?(Cierro la ventana del logueo con .dispose() y creo la nueva clase que contiene el nuevo JFrame).

EDITO: si aislo la clase, y la ejecuto por separado, funciona perfectamente.


« Última modificación: 7 Mayo 2010, 20:30 pm por nerckos » En línea

sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: JFrame
« Respuesta #1 en: 8 Mayo 2010, 00:49 am »

pueden ser varias cosas
usas linux?
usas la clase graphic?
sobreescribes el metodo PaintConponent paint?
usas colores?
calculas colores en tiempo de ejecución?
usas alguna librería externa que trabaje con gráficos o vídeos?
le as puesto simplemente colores a los componentes usando el ide?
hiciste el formulario en un sistema operativo diferente al que lo as probado?
usas alguna librería para el trabajo con swing (swing aplication framework)?

primero prueba quitándole todos los colores que le ayas puesto al formulario
acerca del tamaño simplemente cuando llames a la nueva ventana pon le el tamaño deseado con setDimension(int a,int b) si el problema del tamaño persiste tu mismo le pusiste mal el tamaño en algun otro sitio




En línea

nerckos

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: JFrame
« Respuesta #2 en: 8 Mayo 2010, 01:31 am »

Uso y programo en win, y todas las pruebas las hago en el mismo pc que programo. Uso el paquete swing para añadir los componentes(JList, JTextArea y un JPanel), y solo e usado un setBackgroung() para anyadirle color al JFrame y al JPanel.

Pero esque me da la impresion de que no crea bien el objeto, porque cuando lo creo en un proyecto nuevo (uso netbeans) y lo ejecuto funciona a la perfeccion, por eso creo que tiene algo que ver con el JFrame del logueo (desde el que creo e instancio el JFrame que no funciona).

EDITO: las clases estan en el mismo paquete, por lo tanto no hay problemas de visibilidad.
« Última modificación: 8 Mayo 2010, 01:56 am por nerckos » En línea

sapito169


Desconectado Desconectado

Mensajes: 628



Ver Perfil
Re: JFrame
« Respuesta #3 en: 8 Mayo 2010, 03:24 am »

pon cogido
En línea

nerckos

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: JFrame
« Respuesta #4 en: 8 Mayo 2010, 11:08 am »

Clase Entrada(la del logueo)

Código:
private void clickEntrar(MouseEvent e){

        try{
            if(usuario.getText().length()==0 || contrasenya.getPassword().length==0 ){

                JOptionPane.showMessageDialog(entrada, "Error usuario y/o contrasenya vacios.", "Error", JOptionPane.ERROR_MESSAGE);

            }else{

                //entrante=new DataInputStream(conexion.getInputStream());
                //saliente=new DataOutputStream(conexion.getOutputStream());

                saliente.writeUTF("01 ");
                String usu="02 "+usuario.getText();
                char[] aux=contrasenya.getPassword();
                String auxPass=new String(aux);
                auxPass="03 "+auxPass.substring(0);
                saliente.writeUTF(usu);
                saliente.writeUTF(auxPass);
                saliente.flush();

                if((entrante.readUTF()).equals("07 OK")){
                    juego=new PantallaJuego(saliente,entrante);//Instacio el objeto            //que contiene un nuevo JFrame
                    entrada.dispose();//Aqui destruyo el objeto entrada(ventana de logueo)
                    juego.iniciarPantallaJuego();
                }else{
                    JOptionPane.showMessageDialog(entrada,
                            "Usuario y/o contrasenya incorrectos", "Error", JOptionPane.ERROR_MESSAGE);
                }

            }
        }catch(Exception err){
            System.err.println(err.toString());
        }
    }

Clase PantallaJuego(el siguiente JFrame)

Código:
//Le doy unas propiedades al JFrame
        this.entrada=entrada;
        this.salida=salida;
        JFrame.setDefaultLookAndFeelDecorated(true);
        pantallaJuego = new JFrame();
        pantallaJuego.setTitle("Sala de Juego");
        pantallaJuego.setLocationRelativeTo(null);
        pantallaJuego.setVisible(false);
        pantallaJuego.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        pantallaJuego.getContentPane().setLayout(new GridBagLayout());
        pantallaJuego.getContentPane().setBackground(Color.WHITE);
        pantallaJuego.setSize(600,600);
        pantallaJuego.setResizable(false);

public void iniciarPantallaJuego(){
       
        pantallaJuego.setVisible(true);

        try{
            while(!finPartida){
                if(juegoIniciado){
                    truc.setEnabled(true);
                    if(ronda==1){
                        envid.setEnabled(true);
                        reparteCartas();
                    }else{
                        envid.setEnabled(false);
                    }
                }else{
                    envid.setEnabled(false);
                }
                refrescarJugadores();
                refrescarChat();
                refrescarJuego();
            }
        }catch(Exception e){
            System.out.println(e.toString());
        }
    }

En línea

Chuidiang

Desconectado Desconectado

Mensajes: 161



Ver Perfil WWW
Re: JFrame
« Respuesta #5 en: 8 Mayo 2010, 12:06 pm »

Es posible que tu problema venga de estas dos cosas:

Código
  1. private void clickEntrar(MouseEvent e){
  2.   ....
  3.   if((entrante.readUTF()).equals("07 OK")){
  4. }

Los MouseEvent los lanza java en el mismo hilo que usa para pintar las ventanas y refrescarlas. Un readUTF() se queda bloqueado hasta que llega algo, por lo que el hilo de pintado de ventanas y refresco se queda bloqueado hasta que llegue algo por el "entrante". Eso implica que la ventana ni se pinta ni se refresca ni se puede manejar hasta que llegue algún mensaje.

Prueba a lanzar un hilo en clickEntrar() para la lectura del socket.

http://www.chuidiang.com/chuwiki/index.php?title=El_hilo_de_awt

Se bueno.
En línea

nerckos

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: JFrame
« Respuesta #6 en: 8 Mayo 2010, 14:07 pm »

Hice la modificacion que me dijiste, pero sigue sin dibujarme la ventana, por eso le añadí un hilo cuando instancia la clase para crear el nuevo frame, pero sigue sin dibujarla.

Código:
    private void clickEntrar(MouseEvent e){

        try{
            if(usuario.getText().length()==0 || contrasenya.getPassword().length==0 ){

                JOptionPane.showMessageDialog(entrada, "Error usuario y/o contrasenya vacios.", "Error", JOptionPane.ERROR_MESSAGE);

            }else{

                //entrante=new DataInputStream(conexion.getInputStream());
                //saliente=new DataOutputStream(conexion.getOutputStream());

                saliente.writeUTF("01 ");
                String usu="02 "+usuario.getText();
                char[] aux=contrasenya.getPassword();
                String auxPass=new String(aux);
                auxPass="03 "+auxPass.substring(0);
                saliente.writeUTF(usu);
                saliente.writeUTF(auxPass);
                saliente.flush();

                Runnable miRunnable = new Runnable(){
                    public void run(){
                        try{
                                auxx=entrante.readUTF();

                            }
                            catch (Exception e)
                            {
                               e.printStackTrace();
                            }
                    }
                };
                Thread hilo = new Thread (miRunnable);
                hilo.start();

                if(auxx.equals("07 OK")){
                    Runnable miHilo=new Runnable(){
                        public void run(){
                            try{
                            juego=new PantallaJuego(saliente,entrante);
                            entrada.dispose();
                            juego.iniciarPantallaJuego();   
                            }catch(Exception e){}
                        }
                    };
                    Thread hiloo=new Thread(miHilo);
                    hiloo.start();

                }else{
                    JOptionPane.showMessageDialog(entrada,
                            "Usuario y/o contrasenya incorrectos", "Error", JOptionPane.ERROR_MESSAGE);
                }

            }
        }catch(Exception err){
            System.err.println(err.toString());
        }
    }
En línea

Chuidiang

Desconectado Desconectado

Mensajes: 161



Ver Perfil WWW
Re: JFrame
« Respuesta #7 en: 8 Mayo 2010, 14:30 pm »

Al poner un hilo, la ejecución ya no es secuencial. No puedes lanzar un hilo para leer aux y esperar que esté disponible inmediatamente después

Código
  1. Runnable miRunnable = new Runnable(){
  2.                    public void run(){
  3.                        try{
  4.                                auxx=entrante.readUTF();
  5.  
  6.                            }
  7.                            catch (Exception e)
  8.                            {
  9.                               e.printStackTrace();
  10.                            }
  11.                    }
  12.                };
  13.                Thread hilo = new Thread (miRunnable);
  14.                hilo.start();
  15.  
  16.                // auxx no tiene porque estar aqui relleno.
  17.                if(auxx.equals("07 OK")){
  18.  

No metas en el hilo sólo el read(), mete también todo lo que va detrás.

Se bueno.
En línea

nerckos

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: JFrame
« Respuesta #8 en: 8 Mayo 2010, 14:53 pm »

cuando le hago un debug, auxx si que esta relleno.
En línea

Chuidiang

Desconectado Desconectado

Mensajes: 161



Ver Perfil WWW
Re: JFrame
« Respuesta #9 en: 8 Mayo 2010, 15:30 pm »

Si has puesto ahí el breakpoint es normal, ya que entre que se para el debugger y tú miras la variable, al hilo le da tiempo a leer del socket y rellenarlo. En cualquier caso, al menos estará relleno con el contenido de esta línea que tienes al principio

char[] aux=contrasenya.getPassword();

y no necesariamente con lo leído del socket.

Se bueno.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[NetBeans] JDialog dentro de un JFrame
Java
~ Yoya ~ 4 12,240 Último mensaje 6 Marzo 2011, 23:52 pm
por ~ Yoya ~
fondo para un JFrame consulta. « 1 2 »
Java
XpandyX 15 15,795 Último mensaje 12 Agosto 2012, 11:47 am
por reylagarto19
Threads-JFrame
Java
soser 2 5,119 Último mensaje 18 Abril 2011, 05:50 am
por soser
ayuda con jframe
Java
include (); 4 2,910 Último mensaje 7 Noviembre 2012, 05:34 am
por ChavalChavito
Problema con JFrame
Java
.:UND3R:. 2 2,142 Último mensaje 1 Agosto 2013, 04:37 am
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines