Foro sobre Java SE > Aplicación que se ejecute una sola vez.
Guenas.
El sistema del fichero claramente puede dar problemas.
El ser Socket servidor te puede ser muy útil.
Bastaría con que la aplicación controlara el tema. Si no puede abrir el socket porque ya esta escuchando indica que ya esta abierta la aplicación. Basta con abrir entonces un socket cliente para mandarle un mensaje a la aplicación abierta que le indicara que se maximizara.
Seguro que hay mas sistemas, pero este me parece muy adecuado y simple.
Un saludo,
Paposo
Paposo
Hola Paposo, hay una aplicación abierta y minimizada en la barra de notificaciones; cuando me voy por ejemplo al escritorio a abrir nuevamente la aplicación (ojo no seria la que se esta ejecutando), pregunto, es posible que esta ultima se ejecute y maximice la otra que esta minimizada?
espero hacerme entender.
resalpa84
Guenas.
No se si te he entendido muy bien.
Lo que deseas es:
- No deseas que la misma aplicacion pueda estar mas de una vez en ejecucion. Es decir, si esta minimizada y se lanza de nuevo, en lugar de abrirse una nueva se maximice la que ya esta en ejecucion.
o
- Deseas que puedan existir varias ejecuciones simultaneas de la misma pero que cada vez que ejecutes una nueva ademas se maximicen las que estan minimizadas
Salut
Paposo
Paposo
Buenas,
Es lo que te dice Paposo, la aplicacion cuando ya esta abierta tiene un socket a la escucha. Al inicio, siempre lo primerto que hace es intentar conectarse por ese socket, y si lo consigue envia un mensaje de 'maximizar' y termina su ejecucion. Si no puede conectarse al socket es porque no hay otra instancia abierta por lo que se arranca normalemente, levantando el socket para que futuras intancias sepan que ya hay una abierta.
Un ejemplo:
http://www.rbgrn.net/content/43-java-single-application-instance
Un saludo
UnoPorAhi
Saludos,
Gracias a los dos por responder,
Yo ya tengo el código que me manda un mensaje advirtiéndome que la aplicación ya se esta ejecutando.
Lo que deseo hacer es lo primero que dice paposo.
"No deseas que la misma aplicacion pueda estar mas de una vez en ejecucion. Es decir, si esta minimizada y se lanza de nuevo, en lugar de abrirse una nueva se maximice la que ya esta en ejecucion."
resalpa84
Buenas,
Lo que quieres hacer lo tengo claro, lo que no tengo ni idea es que es exactamente lo que necesitas (dices que tienes el codigo de deteccion, que te falta entonces? como maximizar una aplicacion minimizada? http://stackoverflow.com/questions/479523/java-swing-maximize-window)
Un saludo
UnoPorAhi
Hola UnoPorAhi; http://stackoverflow.com/questions/479523/java-swing-maximize-window no me sirve.
Voy a expresartelo de otra forma para darme a entender contigo.
Tienes una aplicación A y una aplicación B, ambas corriendo de manera independiente; imagínate que la Aplicación A se minimizó, como harías para maximizar la aplicación A usando la aplicación B?
resalpa84
Buenas,
Lo QUE QUIERES hacer lo tengo claro desde el principio, pero no asi el QUE NECESITAS/QUE TE FALTA/QUE TIENES HECHO. Asi poco se puede hacer sin tener una bola de cristal
Si como dices, tienes ya el codigo de socket en la aplicacion A que recibe un mensaje de la aplicacion B, entonces solo tienes que hacer que cuando el socket reciba un mensaje 'maximizar' maximice la app con el codigo que te he pasado. Cual es el problema entonces?
Quizas el problema es este?
Yo ya tengo el código que me manda un mensaje advirtiéndome que la aplicación ya se esta ejecutando.
Por lo poco que comentas sobre tu solucion, a mi me da que lo tienes hecho al reves. Haces que la aplicacion A notifique a la aplicacion B, cuando deberia ser B la que envie el mensaje a la aplicacion A para que se maximice.
Un saludo
UnoPorAhi
ufff, como que esta difícil el problema, no quiero crear procesos que se ejecuten en segundo plano porque me parecen muy invasivo, pero como van las cosas me tocará hacerlas.
El problema esta abierto, :(
resalpa84
Guenas.
Noooo. El problema esta cerrado.
Pon un hilo controlando el accept del ServerSocket.para que reaccione a la petición de maximizar.
Eso no tiene nada de invasivo. Creo que deberías repasar todos los tutoriales que java respecto a la multitarea. Todas tus aplicaciones mejoraran muchísimo si entiendes este concepto que hasta ahora se te escapa.
Pasa de mi, pero hazle caso a UnoPorAhi. Mejoraras tu y tus aplicaciones mucho.
Salut,
Paposo
Paposo
¿Has echado un vistado al SingleInstaceService de JNLP?
http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/examples.html#SingleInstanceService
Saludos.
ececiel
Estimado, la solucion del server socket es la mas adecuada, pero para poderla maximizar se me ocurre lo siguiente, en primera instancia, cuando se ejecute la primera instancia de la aplicacion va a ocupar el puerto xxx, pues bien eso impedira que otra instancie se ejecute, ahora en la aplicacion crea un hilo que este en escucha de ese puerto y cuando un cliente se intente conectar, pues lo que va ha hacer es maximizarse, para ello puedes user setExtendedState de JFrame, luego, en la misma aplicacion debes poner un try y un catch para cuando arranque la aplicación, el primer paso será intentar abrir el puerto xxx por el serverSocket, si hay una excepción debido a que otra instancia anterior ya la esta usando, pues en el catch crea un Socket Cliente conectandose a localhost sobre el mismo puerto xxx, esto conectara con el server socket de la instancia inicial y la maximizara, luego de conectado, solo finaliza la segunda aplicación.
Espero haberte ayudado.
German

Saludos a todos.
Hace ya mas de un año hice una aplicación en un almacén para motos, y la contribución del mismo gracias también a los consejos que recibo en esta comunidad, aun le hago modificaciones para mejorarlo o agregarle funcionalidades.
La ultima fue la consulta de datos en un formulario web del gobierno, aqui me recomendaron integrar un web browser, yo use y recomiendo htmlunit.
Para dicha consulta en el formulario uso hilos para que estos entes como centinelas pendientes a las consultas; pero para que esto sea útil necesitaba que el programa no fuera cerrado por el usuario, así de busque la forma de mandarlo a la barra de notificaciones de guindons.
Pero ahora tengo otro problema, quiero que el programa solo pueda ser ejecutado una vez; en Internet he leído la opción del archivo temporal y no me termina de convencer pues se me ocurre que por ejemplo si se forza la aplicación a cerrar el archivo puede quedar y la aplicación no ejecutarse después; ademas he probado la opción del ServerSocket y me gusta pero...
Como hago para que en vez de lanzarme un mensaje diciéndome que no se puede ejecutar la aplicación porque ya esta abierta, maximice la aplicación que ya esta abierta?
Conocen otra opción?