2010-05-30 72 views
1

我正在使用一个ServerSocket端口来运行我的Java Swing应用程序的一个实例,所以如果用户试图打开该程序的另一个实例,我会向他显示一条警告“另一个实例已经打开”。这工作正常,但没有显示此消息,我想设置专注于运行的应用程序本身,就像一些程序(MSN Messenger),即使它被最小化。如何设置焦点已运行的应用程序?

对于各种操作系统,是否有解决方案?

回答

2

由于您使用服务器套接字我假设您使用java.net.BindException来检测您的应用程序已在运行。如果您启动第二个实例,则可以发送一条控制消息,指示您在退出之前先将应用程序标准化(如果已最小化)。

if (msg == BRING_TO_FRONT) { 
    frame.setState(Frame.NORMAL); 
    frame.toFront(); 
} 
+0

我使用BindException但如何获得“框架”实例? – Brad 2010-05-30 09:00:08

+0

我想这里的想法是从第二个应用程序实例中打开一个套接字客户端,将它连接到第一个应用程序实例的套接字服务器,并使用此连接来告诉第一个应用程序将其置于前面。 – jfpoilpret 2010-05-30 10:02:38

+0

正是第二个应用程序建立到第一个应用程序的连接并发送消息。第一个应用程序已经知道它的框架,并可以执行我的答案中提供的代码片段。您无法以便携方式枚举窗口。 – stacker 2010-05-30 13:28:02

1

我不知道这是绝对正确的,但这里的最终代码我用它为我工作得很好:

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); 
    } 
} 

}

相关问题