Quero que, depois do sistema pronto e funcionando, que o usuário, caso já tenha uma instância do programa aberta no SO, não consiga abrir outras.
Tem como fazer isso.
use o Pattern Singleton
Isso só evita abri duas janelas no mesmo programa e não dois programas por maquina.
Da uma procurada pelo fórum que essa questão já foi discutida aqui antes e já tem algumas soluções.
[code]/*
- MultipleInstanceChecker.java
 - Created on 2 de Março de 2007, 16:53
 - To change this template, choose Tools | Template Manager
 - and open the template in the editor.
*/ 
import java.awt.Window;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
- 
Helper class to avoid running more than one concurrent instance of
 - 
a Java program.
 - 
Rationale
 - 
With some applications it may be useless or even dangerous to run
 - 
more than one instance at the same time.
 - 
This class helps a Java application to determine if another instance
 - 
is running already.
 - 
It does so by trying to reserve a server socket for a given port.
 - 
If the server socket can be reserved, this instance is the first one.
 - 
Otherwise a user-defined byte signature is sent to the running
 - 
instance, which can then perform some action (e.g. bringing its
 - 
own window to the front of the desktop).
 - 
Usage
 - 
public class MultipleInstanceTest {
 - 
public static void main(String[] args) { - 
final int PORT = 44593; - 
final byte[] SIGNATURE = new byte[] {0x34, 0x55, 0x7c, 0x03, 0x64, 0x22, 0x1e, 0x4a}; - 
JFrame frame = new JFrame("MultipleInstanceChecker test app"); - 
JLabel label = new JLabel("Starting up..."); - 
frame.add(label); - 
frame.pack(); - 
frame.setVisible(true); - 
MultipleInstanceChecker checker = new MultipleInstanceChecker(SIGNATURE, PORT, frame); - 
int result = checker.check(); - 
String message = null; - 
switch(result) { - 
case(MultipleInstanceChecker.STATUS_FIRST_INSTANCE): - 
{ - 
message = "First instance."; - 
break; - 
} - 
case(MultipleInstanceChecker.STATUS_INSTANCE_EXISTS): - 
{ - 
message = "Not the first instance."; - 
break; - 
} - 
case(MultipleInstanceChecker.STATUS_SECURITY_EXCEPTION): - 
{ - 
message = "Some security exception. Port in use by another application?"; - 
break; - 
} - 
} - 
label.setText(message); - 
// in a real application: add a call to - 
// checker.shutdownServerSocketThread - 
// in the application's "window close" code - 
} - 
}
 - 
@author Marco Schmidt
/
public class MultipleInstanceChecker {
/* Length of byte[] signature in bytes. */
public static final int SIGNATURE_LENGTH = 8;// result values for {@link #check()}.
public static final int STATUS_FIRST_INSTANCE = 1;
public static final int STATUS_INSTANCE_EXISTS = 2;
public static final int STATUS_SECURITY_EXCEPTION = 3;private byte[] signature;
private int socketPort;
private ServerSocket serverSocket;
private Window window;
private boolean shutdown;/**
- Create a MultipleInstanceChecker.
 - @param applicationSignature a byte array of length 8 or larger
 - 
@param port number of the port for which a server socket is to be reserved
*/
public MultipleInstanceChecker(byte[] applicationSignature, int port) {
if (applicationSignature == null ||
applicationSignature.length != SIGNATURE_LENGTH) {
throw new IllegalArgumentException("Signature length in bytes must be " +
SIGNATURE_LENGTH);
}
signature = new byte[applicationSignature.length];
System.arraycopy(applicationSignature, 0, signature, 0, applicationSignature.length);
socketPort = port;
shutdown = false;
} 
public MultipleInstanceChecker(byte[] applicationSignature, int port, Window win) {
this(applicationSignature, port);
setWindow(win);
}public int check() {
try {
serverSocket = new ServerSocket(socketPort);
serverSocket.setSoTimeout(0);
new Thread(
new Runnable() {
public void run() {
while (true) {
Socket socket = null;
InputStream in = null;
// create a socket for incoming “call”
try {
socket = serverSocket.accept();
} catch (IOException ioe) {
continue;
}
if (shutdown) {
break;
}
// create InputStream to read from other process
try {
in = socket.getInputStream();
} catch (IOException ioe) {
close(socket, in);
continue;
}
// allocate data array
byte[] data = new byte[SIGNATURE_LENGTH];
// read SIGNATURE_LENGTH bytes from input
if (!readSignature(in, data)) {
close(socket, in);
continue;
}
close(socket, in);
boolean equal = true;
for (int i = 0; i < data.length; i++) {
if (data[i] != signature[i]) {
equal = false;
break;
}
}
if (equal) {
onRestart();
}
}
try {
serverSocket.close();
} catch (IOException ioe) {} } } ).start(); return STATUS_FIRST_INSTANCE; } catch (IOException ioe) { // could not reserve server socket // try to send signature to other process, making it call // its onRestart method // try to get socket on that port Socket socket = null; try { socket = new Socket("localhost", socketPort); } catch (IOException ioe2) { return STATUS_INSTANCE_EXISTS; } // get stream to write to OutputStream out = null; try { out = socket.getOutputStream(); } catch (IOException ioe2) { close(socket); } // write signature try { out.write(signature); out.flush(); } catch (IOException ioe2) { } close(socket, out); return STATUS_INSTANCE_EXISTS; } catch (SecurityException se) { return STATUS_SECURITY_EXCEPTION; }}
private void close(Socket socket) {
if (socket != null) {
try {
socket.close();
} catch (IOException ioe) {} }}
private void close(Socket socket, InputStream in) {
close(socket);
if (in != null) {
try {
in.close();
} catch (IOException ioe) {} }}
private void close(Socket socket, OutputStream out) {
close(socket);
if (out != null) {
try {
out.close();
} catch (IOException ioe) {} }}
public void onRestart() {
System.out.println(“Restart detected!”);
if (window != null) {
window.toFront();
}
}private boolean readSignature(InputStream in, byte[] data) {
int index = 0;
while (index < data.length) {
try {
int numRead = in.read(data, index, data.length - index);
if (numRead > 0) {
index += numRead;
}
} catch (IOException ioe) {
return false;
}
}
return true;
}public void setWindow(Window win) {
window = win;
}public void shutdownServerSocketThread() {
// set shutdown variable
shutdown = true;
// make thread accept once more and then react to shutdown==true
try {
new Socket(serverSocket.getInetAddress(), serverSocket.getLocalPort()).close();
} catch (IOException ioe) {
}
}
}[/code] 
O teu sistema é multiusuário? Se for dá pra controlar no banco de dados, os que estão ou não logados, daí fica fácil…
daí ao abrir o sistema, verifica no banco se o usuário já está ou não logado