Java 一次只打开一个摆动框架窗口

Java 一次只打开一个摆动框架窗口,java,swing,Java,Swing,我开发了一个swing应用程序,但每次运行应用程序时,新窗口都会打开。 我希望如果一个窗口已经打开,另一个窗口不允许打开 听起来你一次只想打开一个应用程序。在这种情况下,为什么不在应用程序运行时取出文件锁或类似的锁,并在启动时进行检查呢。当然,最头痛的是在程序不能完全退出时清除锁。是Java单应用程序实例的一个例子: 单实例应用程序只允许其中一个应用程序运行,无论用户尝试启动多少次 另见: 应用程序尝试打开特定端口上的套接字。如果应用程序的另一个实例已经在运行,打开套接字将失败 这对您来说已经足

我开发了一个swing应用程序,但每次运行应用程序时,新窗口都会打开。
我希望如果一个窗口已经打开,另一个窗口不允许打开

听起来你一次只想打开一个应用程序。在这种情况下,为什么不在应用程序运行时取出文件锁或类似的锁,并在启动时进行检查呢。当然,最头痛的是在程序不能完全退出时清除锁。

Java单应用程序实例的一个例子:

单实例应用程序只允许其中一个应用程序运行,无论用户尝试启动多少次

另见:

应用程序尝试打开特定端口上的套接字。如果应用程序的另一个实例已经在运行,打开套接字将失败

这对您来说已经足够了,因此您不必使用用于向第一个启动的应用程序注册新应用程序的代码部分

与向文件系统/注册表/任何东西写入某种标志相比,使用套接字有一个很大的优势:

即使应用程序崩溃,它也会被删除。

正如Peter Lang所链接的,我首选的解决方案是使用套接字。当你的应用程序启动时,你可以启动一个服务器套接字,监听本地主机上的传入连接(加上你选择的端口)。在代码中出现这种情况之前,您可以尝试连接到服务器套接字,如果连接成功,您就知道已经打开了另一个实例,因此可以使用适当的消息退出当前实例


在您的服务器套接字实现中,您还可以添加一些功能,在接收到传入连接时,您实际上会将应用程序的当前实例强制到前台。

您的意思是像单机版一样运行GUI吗?我过去通过创建静态私有“视图管理器”来实现这一点这样,它是空的,直到第一次创建gui时才创建或可见,之后就像经典的单例一样,当应用程序再次运行时,gui被设置为可见。。。我有几个框架遵循这种设计——在这些框架中,GUI不是“主要的”,还有命令行和类似的界面,因此GUI是通过命令行调用的…

使用单音模式,如图所示

使用套接字似乎是一个非常有用的想法-比我提到的文件锁可靠得多。感谢您的响应您给出的解决方案非常有效。但是使用哪个端口号呢?就我个人而言,我会在运行时分配一个端口,而且似乎不可避免地要写入temp dir中的一个小文件来保存所选的端口号。从08/07开始,Link Dead就已经失效了/2020@NWS:我不确定许可证是否允许我在这里发布代码(这会更好),但我修复了到archive.org的链接,并添加了指向另一个示例的链接。谢谢你的提醒!
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();
    }
}