我开发了一个swing应用程序,但每次运行应用程序时都会打开新窗口。 我希望如果一个窗口已经打开,其他窗口不允许打开。
答案 0 :(得分:18)
Here是 Java单一应用程序实例的示例:
单个实例应用程序只允许运行一个应用程序,无论用户尝试启动多少次。
应用程序尝试在特定端口上打开Socket。如果您的应用程序的另一个实例已在运行,则打开Socket失败。
这应该已经足够了,所以您不必使用用于将新应用程序注册到第一个应用程序的代码部分。
与向文件系统/注册表/无论如何写一些标志相比,使用Socket有一个很大的优势:
即使您的应用程序崩溃,它也会被删除。
答案 1 :(得分:1)
实际上听起来你只想一次打开一个应用程序。在这种情况下,为什么不在应用程序运行时取出文件锁或类似文件,并在启动时检查它。当然,令人头疼的是在您的程序没有干净地退出的情况下清除锁定。
答案 2 :(得分:1)
我的首选解决方案是,正如彼得郎所链接的那样,使用套接字。当您的应用程序启动时,您可以启动服务器套接字,侦听localhost上的传入连接(以及您选择的端口)。在您的代码中发生这种情况之前,您可以尝试建立与服务器套接字的连接,如果成功,您就会知道已经打开了另一个实例,因此您可以使用适当的消息退出当前实例。
在服务器套接字实现中,您还可以添加在接收传入连接时实际强制将应用程序的当前实例置于前台的功能。
答案 3 :(得分:0)
public class Samp {
JFrame f=new JFrame();
File ff=new File("D:\\a.txt");
FileWriter fw;
public Samp() {
f.setBounds(0, 0, 200, 200);
try {
Scanner sc=new Scanner(ff);
if(!sc.hasNext()) {
fw=new FileWriter(ff);
fw.write("Running");
fw.close();
} else {
System.exit(0);
}
} catch(Exception e) {
System.out.println(e.getMessage());
}
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
Scanner sc = new Scanner(ff);
if(sc.hasNext()) {
fw=new FileWriter(ff);
fw.write("");
fw.close();
}
} catch (Exception ex) { }
}
};
f.setVisible(true);
f.addWindowListener(wndCloser);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new Samp();
}
}
答案 4 :(得分:0)
你的意思是像单身人士一样运行GUI吗?我过去通过制作一个静态私有“视图管理器”来做到这一点,这样它就是空的,直到第一次创建gui之后才创建或可见就像经典的单例一样,当应用程序再次运行时,GUI设置为可见...我有几个遵循此设计的框架 - 在这些框架中,GUI不是“主要的”还有命令行等接口,以便通过命令行召唤GUI ...
答案 5 :(得分:0)
使用example中显示的单例模式!