Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Como cerrar una Jframe desde un DataInputStrem

Estas en el tema de Como cerrar una Jframe desde un DataInputStrem en el foro de Java en Foros del Web. Hola Saludos a Todos, esta vez el problema dentro del Servidor/Cliente. Se pretende que por medio de un comando enviado de la maquina 'Servidor' , ...
  #1 (permalink)  
Antiguo 02/02/2018, 23:03
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 26
Antigüedad: 2 años, 4 meses
Puntos: 3
Sonrisa Como cerrar una Jframe desde un DataInputStrem

Hola Saludos a Todos, esta vez el problema dentro del Servidor/Cliente.

Se pretende que por medio de un comando enviado de la maquina 'Servidor', a la maquina 'Cliente', se ejecuten ciertas instrucciones ejemplo:

Que el 'Cliente' al recibir el comando "/bloquea", llame una pantalla de bloqueo, esta instrucción ya me funciona y me llama el Jframe correspondiente, el código utilizado es el siguiente:

- Se lee el mensaje enviado por el 'Servidor' y se guarda en un String Array, posteriormente se separa y si dentro del array existe una palabra que sea igual al comando "/bloquea", se ejecuta la acción del if llamando así el nuevo Jframe

Cabe decir que dicho texto proviene de un DataInputStrem;

Código Java:
Ver original
  1. if (line.startsWith("@")) {
  2.           String[] words = line.split("\\s", 2);
  3.           if (words.length > 1 && words[1] != null) {
  4.             words[1] = words[1].trim();
  5.             if (!words[1].isEmpty()) {
  6.               synchronized (this) {
  7.                 for (int i = 0; i < maxClientsCount; i++) {
  8.                   if (threads[i] != null && threads[i] != this
  9.                       && threads[i].clientName != null
  10.                       && threads[i].clientName.equals(words[0])) {
  11.                     threads[i].os.println("<" + name + "> " + words[1]);
  12.                     int port = 2222;
  13.                     jFrameBlocked block = new jFrameBlocked();
  14.                     String comando=words[1];//Se separa la palabra de comando enviado
  15.                                                            //Por el 'Servidor'
  16.                     if("/bloquea".equals(comando)){
  17.                        //Si es igual a '/bloquea' se llama el nuevo frame                      
  18.                        block.setVisible(true);
  19.                     }
  20.                     //aqui el problema =(
  21.                     if("/desbloquea".equals(comando)){                        
  22.                        block.setVisible(false);
  23.                     }
  24.                    
  25.                     /*
  26.                      * Echo this message to let the client know the private
  27.                      * message was sent.
  28.                      */
  29.                     this.os.println(">" + name + "> " + words[1]);
  30.                     break;
  31.                   }
  32.                 }
  33.               }
  34.             }
  35.           }
  36.         }

Ahora el problema radica, en que al cambiar el parametro de setVisible a False, la ventana antes mencionada no se oculta ni se cierra

El frame que se manda a llamar contiene un Login conectado a Base de datos, de iniciar sesión este oculta la ventana y el control de la maquina 'Cliente' vuelve al usuario; la idea como tal es que el servidor pueda ocultarla sin necesidad de iniciar sesión y únicamente enviado el comando "/desbloquea".

Espero tengan alguna solución pues he intentado ya muchas cosas y visto varias paginas pero ninguna me ayuda.

...Por cierto por ahora el cliente recibe las instrucciones desde la ventana chat del cliente y al llamar el otro frame, la primer ventana no se debe cerrar pues ahí llegan los comando....
  #2 (permalink)  
Antiguo 03/02/2018, 00:51
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.450
Antigüedad: 10 años
Puntos: 182
Respuesta: Como cerrar una Jframe desde un DataInputStrem

Si tu jFrameBlocked extiende de jFrame puedes probar estas dos opciones

1. añadir block.dispose() después de hacer el setVisible a false.
2. Sustituir por block.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));

Creo que con la primera ya te funcionaría.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 03/02/2018, 02:06
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 26
Antigüedad: 2 años, 4 meses
Puntos: 3
Respuesta: Como cerrar una Jframe desde un DataInputStrem

Hola, gracias por contestar.

Anteriormente ya había usado el block.dispose(); pero no me funciona.
Por otra parte, probe con el
Código Java:
Ver original
  1. block.dispatchEvent(new WindowEvent(block, WindowEvent.WINDOW_CLOSING));

Espero haberlo escrito bien era... (new WindowEvent(block,WindowEvent.WINDOW_CLOSING));

La cosa es que no funciono alguna otra idea u otra forma de hacerlo ?

Última edición por sgrajaleshdz; 03/02/2018 a las 02:07 Razón: mal escrito
  #4 (permalink)  
Antiguo 03/02/2018, 10:55
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.450
Antigüedad: 10 años
Puntos: 182
Respuesta: Como cerrar una Jframe desde un DataInputStrem

El problema parece ser que el jFrameBlocked tiene un jFrame encapsulado. En ese caso el setVisible y el dispose deberían ejecutarse para ese jFrame. Tienes que poder acceder a ese jFrame de alguna manera, bien extendiendo la clase o modificándola.

Un saludo.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 05/02/2018, 02:01
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 26
Antigüedad: 2 años, 4 meses
Puntos: 3
Respuesta: Como cerrar una Jframe desde un DataInputStrem

Efectivamente eso era Fuzzylog, tuve que rediseñar mi ventana cliente, ahora tengo otro problema, en mi servidor se acepta varias conexiones de clientes, pero cuando mando a llamar la ventana de bloqueo lo hace para todos al igual que si lo oculto, la cosa es que quisiera que solo se ejecute para una maquina en especifico:

Mi codigo de servidor es este:

Código Java:
Ver original
  1. public class PrincipalChat extends JFrame{
  2.     public JTextField campoTexto; //Para mostrar mensajes de los usuarios
  3.     public JTextArea areaTexto; //Para ingresar mensaje a enviar
  4.     private static ServerSocket servidor; //
  5.     private static Socket conexion; //Socket para conectarse con el cliente
  6.     InetAddress address;
  7.     private static String ip; //ip a la cual se conecta
  8.     private static final int maxClientsCount = 10;
  9.     private static final ThreadEnvia[] threads = new ThreadEnvia[maxClientsCount];
  10.     public static PrincipalChat main;
  11.    
  12.     public PrincipalChat() throws UnknownHostException{
  13.         super("Mi Control Cyber - Servidor"); //Establece titulo al Frame
  14.         address = InetAddress.getLocalHost();
  15.         ip=address.getHostAddress();
  16.        
  17.         campoTexto = new JTextField(); //crea el campo para texto
  18.         campoTexto.setEditable(false); //No permite que sea editable el campo de texto
  19.         add(campoTexto, BorderLayout.NORTH); //Coloca el campo de texto en la parte superior
  20.        
  21.         areaTexto = new JTextArea(); //Crear displayArea
  22.         areaTexto.setEditable(false);
  23.         add(new JScrollPane(areaTexto), BorderLayout.CENTER);
  24.         areaTexto.setBackground(Color.orange); //Pone de color cyan al areaTexto
  25.         areaTexto.setForeground(Color.BLACK); //pinta azul la letra en el areaTexto
  26.         campoTexto.setForeground(Color.BLACK); //pinta toja la letra del mensaje a enviar
  27.        
  28.        
  29.         //Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu
  30.         JMenu menuArchivo = new JMenu("Archivo");
  31.         JMenuItem salir = new JMenuItem("Salir");
  32.         menuArchivo.add(salir); //Agrega el submenu Salir al menu menuArchivo
  33.        
  34.         JMenuBar barra = new JMenuBar(); //Crea la barra de menus
  35.         setJMenuBar(barra); //Agrega barra de menus a la aplicacion
  36.         barra.add(menuArchivo); //agrega menuArchivo a la barra de menus
  37.        
  38.         //Accion que se realiza cuando se presiona el submenu Salir
  39.         salir.addActionListener(new ActionListener() { //clase interna anonima
  40.                 public void actionPerformed(ActionEvent e) {
  41.                     System.exit(0); //Sale de la aplicacion
  42.                 }
  43.         });
  44.        
  45.         setSize(400, 400); //Establecer tamano a ventana
  46.         setVisible(true); //Pone visible la ventana
  47.         setResizable(false);//no permite redimencionar
  48.     }
  49.    
  50.     //Para mostrar texto en displayArea
  51.     public void mostrarMensaje(String mensaje) {
  52.         areaTexto.append(mensaje + "\n");
  53.     }
  54.     public void habilitarTexto(boolean editable) {
  55.         campoTexto.setEditable(editable);
  56.     }
  57.  
  58.  
  59.              
  60.    
  61.     /**
  62.      * @param args the command line arguments
  63.      */
  64.     public static void main(String[] args) throws UnknownHostException {
  65.        
  66.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
  67.         /*
  68.          * If Nimbus (introduced in Java SE 6) is not available, stay with the
  69.          * default look and feel. For details see
  70.          * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
  71.          */
  72.         try {
  73.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
  74.                 if ("Windows".equals(info.getName())) {
  75.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());
  76.                     break;
  77.                 }
  78.             }
  79.         } catch (ClassNotFoundException ex) {
  80.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  81.         } catch (InstantiationException ex) {
  82.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  83.         } catch (IllegalAccessException ex) {
  84.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  85.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {
  86.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  87.         }
  88.        
  89.         //</editor-fold>
  90.        
  91.         final PrincipalChat main = new PrincipalChat(); //Instanciacion de la clase Principalchat
  92.         main.setLocationRelativeTo(null);   //Centrar el JFrame
  93.         main.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //habilita cerrar la ventana
  94.                
  95.         main.addWindowListener(new java.awt.event.WindowAdapter() {
  96.             @Override
  97.             public void windowClosing(java.awt.event.WindowEvent evt) {
  98.                 if (JOptionPane.showConfirmDialog(null, "¿Desea realmente salir del sistema?",
  99.                 "Salir del sistema", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
  100.                     main.mostrarMensaje("El servidor a Salido");
  101.             System.exit(0);
  102.             }
  103.         });
  104.        
  105.         ExecutorService executor = Executors.newCachedThreadPool(); //Para correr los threads
  106.  
  107.         try {
  108.             //main.mostrarMensaje("No se encuentra Servidor");
  109.             servidor = new ServerSocket(11111, 100);
  110.             main.mostrarMensaje("Esperando Cliente ...");
  111.  
  112.             //Bucle infinito para esperar conexiones de los clientes
  113.             while (true){
  114.                 try {
  115.                     conexion = servidor.accept(); //Permite al servidor aceptar conexiones        
  116.                    
  117.                        
  118.                     //main.mostrarMensaje("Conexion Establecida");
  119.                     main.mostrarMensaje("Conectado a : " + conexion.getInetAddress().getHostName());
  120.  
  121.                     main.habilitarTexto(true); //permite escribir texto para enviar
  122.  
  123.                     //Ejecucion de los threads
  124.                     executor.execute(new ThreadRecibe_s(conexion, main)); //client
  125.                     executor.execute(new ThreadEnvia_s(conexion, main));
  126.                     break;
  127.                        
  128.                 } catch (IOException ex) {
  129.                     Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
  130.                 }  
  131.             }
  132.    
  133.         } catch (IOException ex) {
  134.             Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
  135.         } //Fin del catch
  136.         finally {
  137.         }
  138.         executor.shutdown();
  139.     }
  140. }

como ves usa dos hilos

el ThreadEnvia_S es este y tiene implementado el Runnable:

Código Java:
Ver original
  1. public ThreadEnvia_s(Socket conexion, final PrincipalChat main){
  2.         this.conexion = conexion;
  3.         this.main = main;
  4.        
  5.         //Evento que ocurre al escribir en el areaTexto
  6.         main.campoTexto.addActionListener(new ActionListener() {
  7.             public void actionPerformed(ActionEvent event) {
  8.                 mensaje = event.getActionCommand();
  9.                 enviarDatos(mensaje); //se envia el mensaje
  10.                 main.campoTexto.setText(""); //borra el texto del enterfield
  11.             } //Fin metodo actionPerformed
  12.         }
  13.         );//Fin llamada a addActionListener        
  14.     }
  15.  
  16.    //enviar objeto a cliente
  17.    public void enviarDatos(String mensaje){
  18.       try {
  19.          salida.writeObject("Servidor>>> " + mensaje);
  20.          salida.flush(); //flush salida a cliente
  21.          main.mostrarMensaje("Servidor>>> " + mensaje);
  22.       } //Fin try
  23.       catch (IOException ioException){
  24.          main.mostrarMensaje("Error escribiendo Mensaje");
  25.       } //Fin catch  
  26.      
  27.    } //Fin methodo enviarDatos
  28.  
  29.    //manipula areaPantalla en el hilo despachador de eventos
  30.     public void mostrarMensaje(String mensaje) {
  31.         main.areaTexto.append(mensaje);
  32.     }
  33.    
  34.     public void run() {
  35.          try {
  36.             salida = new ObjectOutputStream(conexion.getOutputStream());
  37.             salida.flush();
  38.         } catch (SocketException ex) {
  39.         } catch (IOException ioException) {
  40.           ioException.printStackTrace();
  41.         } catch (NullPointerException ex) {
  42.         }
  43.     }


Si necesitas ver el cliente como esta construido Avisame!, pues se me hace que es mucho codigo como para que lo muestre aqui y disculpa las molestias


Debo decir he intentado agregar el Synchonaized a la clas epor que encontre otro chat que los identifica por nombre siempre y cuando lleve un @antes pero no pude hacerlo espero me ayudes a s
  #6 (permalink)  
Antiguo 05/02/2018, 05:00
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.450
Antigüedad: 10 años
Puntos: 182
Respuesta: Como cerrar una Jframe desde un DataInputStrem

No estoy seguro, pero si tienes configurada una información que solo sea accesible desde la máquina para la que sólo quieres que se ejecute eso, si eres capaz de recuperarlo para hacer una comprobación previa a la ejecución ya tendrías lo que quieres.. (puede ser una ip, un parámetro de la llamada... lo que veas).
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 05/02/2018, 12:57
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 26
Antigüedad: 2 años, 4 meses
Puntos: 3
Respuesta: Como cerrar una Jframe desde un DataInputStrem

Entiendo el problema es que no se como decirle a la ventana del servidor que solo Envie tal mensaje a tal ip o tal usuario,

Es decir si tengo 4 maquinas cliente conectadas al servidor y yo escribo el comando, bloquea_pantalla pero solo quiero que esa acción la haga la maquina cliente dos, ¿como le digo que es para esa maquina en concreto y no que es para todas?

Pensé en un ID o por medio del IP o el nombre de la maquina, pero no se como indicarselo al mi servidor :(
  #8 (permalink)  
Antiguo 05/02/2018, 14:41
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.450
Antigüedad: 10 años
Puntos: 182
Respuesta: Como cerrar una Jframe desde un DataInputStrem

Primero intenta que cuando inicie el thread guarde en sesión un String con la ip/nombre de la máquina y el id del thread asociado separado de alguna forma, por ejemplo un "_". Si después intentas finalizar un thread en función del dato de la máquina ya podrías obtener el id del thread asociado y cerrarlo.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #9 (permalink)  
Antiguo 08/02/2018, 22:57
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 26
Antigüedad: 2 años, 4 meses
Puntos: 3
Respuesta: Como cerrar una Jframe desde un DataInputStrem

He solucionado el problema, Gracias.

Por si ha alguien le sirve, extendí un hilo (Thread) al frame que deseaba visualizar y ocultar, lo iguale a si mismo con el nombre en cual por medio del cual lo invoco.

Código Java:
Ver original
  1. public class Block extends Thread {
  2.  
  3. public static Block main;
  4.  
  5. public block(){
  6.         Frame();//inicia el metodo
  7. }
  8.  
  9. public void Frame(){
  10. //Codigo de construccion de componentes 'ejemplo'
  11.  
  12. this.add(componente);
  13. componenete.setbounds(10,10,80,20);
  14.  
  15. }
  16.  
  17. public static void main(String args[]){
  18.              
  19.           Block main = new Block();
  20.  
  21.           /* Basta con que sea publico para poder ocultarlo
  22.            * desde otro frame invocando a main
  23.            */
  24.           main.setVisible(true);
  25.  
  26. }
  27.  
  28.  
  29. }

Para el otro problema de identificación se debe cambiar el DataInputStream por un ObjecInputStrem en el cual se empaquetaran datos, he indicando que llevara dentro, ya sea mediante el uso de una clase que use Getters y Setters, la clase de ve ser Serializable de esta manera los objetos podran empaquetarse correctamente y ser escritos con el


Código Java:
Ver original
  1. paqueteEnvio datosSalida = new paqueteEnvio();
  2.    
  3.                 datosSalida.setName(nom);
  4.                 datosSalida.setMensaje(main.campoTexto.getText());
  5.                 datosSalida.setIp("192.168.1.67");
  6.                
  7.                 salida = new ObjectOutputStream(conexion.getOutputStream());
  8.                 salida.writeObject(datosSalida);

El codigo que permite el setname, setMensaje y setIP....

Código Java:
Ver original
  1. public class paqueteEnvio implements Serializable{
  2.     String ip,mensaje,name;
  3.  
  4.     public String getIp() {
  5.         return ip;
  6.     }
  7.  
  8.     public void setIp(String ip) {
  9.         this.ip = ip;
  10.     }
  11.  
  12.     public String getMensaje() {
  13.         return mensaje;
  14.     }
  15.  
  16.     public void setMensaje(String mensaje) {
  17.         this.mensaje = mensaje;
  18.     }
  19.  
  20.     public String getName() {
  21.         return name;
  22.     }
  23.  
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27. }

Espero a alguien mas le sea útil, gracias por tu ayuda Fuzzylog....

Última edición por sgrajaleshdz; 08/02/2018 a las 22:59 Razón: Texto mal escrito

Etiquetas: chat, comandos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:46.