esta fue mi solución.
un poco mas complicada de lo k espere.
cuando el programa arranca crea un socket y se pone a escuchar con un hilo
cuando el programa es ejecutado nuevamente revisa el puerto y lo encuentra ocupado, asik envia uan señal al puerto y ternima su ejeucion
de esta manera el mismo atajo de teclado k uso para llamar al porgrama sirve para darle una orden, en este caso, k la ventana se ponga al frente
pero eso no es todo
si programo varios atajos de teclado, llamando al programa y dándole argumentos (java -jar algo.jar comando1)(java -jar algo.jar comando2)(java -jar algo.jar comando3)
puede enviar distintas señales dependiendo del argumento. y hacer k el hilo k escucha realice acciones diferentes con cada señal!!!
por cierto, mi escritorio es gnome. pueden programar sus atajos de teclado en system>preferences>keyboard shortcuts o en el ccsm del compiz
weno les dejo el código
espero k les sea de ayuda. comenten si les gusto jeje
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
static ServerSocket SERVER_SOCKET;
static Socket socket;
static DataInputStream dataInput;
static DataOutputStream dataOutput;
public static void main(String[] args) {
try {
SERVER_SOCKET = new ServerSocket(1334);//si ya se esta ejecutando, el puerto estara ocupado
} catch (IOException x) {
System.out.println("puerto 1334 ocupado\n¿Otra instancia de la aplicación se está ejecutando?");
try{
System.out.println("enviando señal");//como ya se esta ejecutando solo hay k ponerlo al frente
socket = new Socket("localhost", 1334);//conectarse al puerto
dataOutput = new DataOutputStream(socket.getOutputStream());//esta tonteria es necesaria en java¬¬
dataOutput.writeUTF("miapp.Show!!!");//enviando orden para k le ventana se haga visible
socket.close();
}
catch(Exception e){e.printStackTrace();}
System.exit(0);//ya enviada la orden se detiene
}
ventana obj = new ventana();//llamar a la ventana principal
//obj.setVisible(true);
try{
if(args[0].equals("hide")){obj.setVisible(false);}else{obj.setVisible(true);}}// si revice un argumento "hide" la ventano no sera visible. cualquier otro argumento sera ignorado
catch(Exception e){obj.setVisible(true);}//sin arguemntos, visible
while (true){//la vetana principal ya esta funcionando y ahora escuchara cuadno se le ordene ir al frente
try{
Socket cliente = SERVER_SOCKET.accept();//espera k algo se coneccte
dataInput = new DataInputStream(cliente.getInputStream());
String text = dataInput.readUTF();//espera a recivir una orden
//System.out.println(text);
if (text.equals("miapp.Show!!!")){obj.setVisible(true);}//se asegura k la orden sea de la misma aplicacion y pone la ventana al frente
}
catch(Exception e){e.printStackTrace();}
}
}
}