Как настроить фокус уже запущенного приложения? - PullRequest
1 голос
/ 30 мая 2010

Я использую порт ServerSocket для запуска только одного экземпляра моего приложения Java Swing, поэтому, если пользователь пытается открыть другой экземпляр программы, я показываю ему предупреждение «Другой экземпляр уже открыт». Это работает нормально, но вместо того, чтобы показывать это сообщение, я хочу сосредоточиться на самом запущенном приложении, как это делают некоторые программы (MSN Messenger), даже если оно было свернуто.

Есть ли решение для этого для различных операционных систем?

Ответы [ 2 ]

2 голосов
/ 30 мая 2010

Поскольку вы используете сокет сервера, я предполагаю, что вы используете исключение java.net.BindException для определения того, что ваше приложение уже запущено. Если вы запустите второй экземпляр, вы можете отправить управляющее сообщение, которое инструктирует ваше первое приложение нормализовать (если оно будет свернуто) перед выходом.

if (msg == BRING_TO_FRONT ) {
   frame.setState(Frame.NORMAL);
   frame.toFront();
}
1 голос
/ 01 июня 2010

Я не знаю, если это абсолютно правильно, но вот последний код, который я использовал, и он прекрасно работает для меня:

public class Loader {
private static final int PORT = 9999;
private static ServerSocket serverSocket = null;  // Server
private static Socket socket = null;  // CLient
private static final String focusProgram = "FOCUS";

public static void main(String[] args) {
    if( !isProgramRunning() ) {
        Main main = new Main();
        main.setVisible( true );
    }
    else {
        System.exit( 2 );
    }
}

private static boolean isProgramRunning() {
    try {
        serverSocket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));  // Bind to localhost adapter with a zero connection queue. 
        SwingWorker<String, Void> anotherThread = new SwingWorker<String, Void>() {  // Do some code in another normal thread.
            @Override
            public String doInBackground() {  // This method is to execute a long code in the other thread in background.
                serverSocketListener();
                return "";
            }
        };
        anotherThread.execute();  // Execute the other tread.
    }
    catch (BindException e) {
        System.err.println("Already running.");
        clientSocketListener();

        return true;
    }
    catch (IOException e) {
        System.err.println("Unexpected error.");
        e.printStackTrace();

        return true;
    }

    return false;
}

public static void serverSocketListener() {  // Server socket
    try {
        System.out.println( "Listener socket opened to prevent any other program instance." );
        socket = serverSocket.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        if( in.readLine().equals( focusProgram ) ) {  // Restore the opened instance however you want.
            Global.getCurrentFrame().setState(Frame.NORMAL);
            Global.getCurrentFrame().toFront();
        }       
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(-1);
    }
}

public static void clientSocketListener() {  // Client socket
    try{
        socket = new Socket(InetAddress.getByAddress( new byte[] {127,0,0,1}), PORT );
        PrintWriter out = new PrintWriter( socket.getOutputStream(), true );
        out.println( focusProgram );
    } catch  (IOException e) {
        System.out.println("No I/O");
        System.exit(1);
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...