2011-11-22 10 views
7

私はJavaでプログラムを持っています(スイングGUI付き)、1つしか存在しないようにしたいと思います。プログラムの別のインスタンスを開こうとした場合、私は現在のインスタンスをフォアグラウンドに持っていきたいと思います。シングルインスタンスJavaプログラムを確認してください

どうすればよいですか?

ありがとうございます。

+6

http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time – onurbaysan

+0

@mKorbelコードを投稿する必要はありません。質問は明確で自己完結型です。イマム・ユダの答えは完璧です。 – alf

+0

シングルインスタンスアプリケーションを実装する別の方法:http://stackoverflow.com/questions/177189/how-to-implement-a-single-instance-java-application – ozhan

答えて

4

Java Web Startを使用してアプリケーションを起動し、JNLP APISingleInstanceServiceを実装します。ここにはdemo. of the SingleInstanceServiceがあります。

プログラムの別のインスタンスを開こうとした場合、現在のインスタンスをフォアグラウンドにしたいと思います。

SingleInstanceListenernewActivation(String[])の方法でそれをフックする。それは、新しい打ち上げのために提供されたすべての引数を渡されます。既存のインスタンスは、新しいファイルに何をするかを決定します(ファイルの変更、新しいタブの追加、無視など)

-3

パターンsingletone:

class SingleInstance { 
private static SingleInstance instance; 

public SingleInstance getInstance() { 
    if (instance==null) 
     instance = new SingleInstance(); 
    return instance; 
} 

private SingleInstance() { 
//construct it! 
} 
} 
+2

アプリケーション内でシングルトンを使用しても、複数のアプリケーションインスタンス(つまり、複数のJVMインスタンス)が保護されるわけではありません。 –

+0

これは1つのクラスローダー内でのみ役立ちます。 OPは "コンピュータ上の1つのインスタンス"のようなものを望んでいます – alf

0

C#では、あなたが通常起動Applicaitonでミューテックスを作成します。それを作成/取得できない場合は、アプリケーションの別のインスタンスがすでに実行されています。残念ながら、これがJavaで同じ動作をしているのか、正確な構文が何であるのかは100%確信していません。

これが役に立ちます。

+5

(Un)幸いにも、Java mutexはプロセス間で共有されません。 – alf

+1

@alf情報をお寄せいただきありがとうございます。毎日何か新しいことを学んでください...これは私の答えを無駄にしますが、おそらくC#の開発者もいません。 –

+0

必ずしも役に立たないとは限りません。アイデアはそこにあります。ミューテックスを実装する別の方法を見つけるだけです。 –

2

Javaにprev-instanceはありませんが、temp(または/ var/run)ディレクトリにpidファイルを作成できます。汚いシンプル&など、名前付きパイプ、Unixソケット、またはJavaリモートメソッド呼び出しを通して、プログラムを自分で通知することができる、トップに既存のウィンドウを持って

を(そして、それFile.deleteOnExit()が終了時にとにかくそれをきれいにします)小さなファイル(例:$TEMP/foobar-app.bring-to-top)に書き込むことです。プログラムはこの小さなファイルを定期的にポーリングして、存在する場合はウィンドウを上に移動し、この小さなファイルを削除します。

Javaが信号を処理できない、つまり、Javaアプリケーションでkill -HUP PIDが動作しない可能性があります。可能であれば、すべてのOSにシグナルがあるわけではありません。

3

ShutDownHookとロックファイルを使用して実行できます。exampleを参照してください。

私はソケットとのServerSocketで一度これをしなかった

+0

私は同意します。これはおそらく最も簡単な実装方法です。これが私が使ってきたものです。 Windowsのファイル削除バグを回避するための起動時に少しトリックがあります。 –

1

...それが最も簡単な方法であると思う:


まず、あなたがあなたのアプリケーションを起動し、ServerSocketがリッスンします一部のポートは、たとえば4004です。そのトリックは、IOExceptionをスローするかどうかをチェックすることです。そうであれば、別のアプリケーションが実行されているか、別のアプリケーションがそのポートを使用しています(check this list for commonly used ports; TCPとUDPポートが互いにブロックしていないことに注意してください)。インスタンスが現在実行中の場合は、TCP Socket(接続が到着することを保証します; UDPは接続しません)を接続して通知することができます。ここで

は一例です:

ServerSocket ss = null; 
try { 
    ss = new ServerSocket(4004); 
} catch (IOException ex0) { 
    // Port either occupied by your application or a foreign one 
    // -> Connect 
    Socket s = null; 
    try { 
     s = new Socket(); 
    } catch (Exception ex1) { 
     // Something went wrong 
    } 
    if (s != null) { 
     // Send some singnal 
    } 
} 
if (ss == null) { 
    // Close or do something else 
} 

(私はそういくつかの物事が間違っている可能性がありますまたはより良い行うことができる、私の記憶の外にこれを書いています)。

関連する問題