только одно открытое окно - PullRequest
6 голосов
/ 27 марта 2010

Я разработал одно приложение Swing, но каждый раз, когда вы запускаете приложение, открывается новое окно. Я хочу, чтобы, если одно окно уже открыто, другое не позволяло открыть.

Ответы [ 6 ]

18 голосов
/ 27 марта 2010

Здесь является примером Экземпляра единого приложения Java :

Приложение с одним экземпляром позволяет запускать только одно приложение независимо от того, сколько раз пользователь пытается его запустить.

Приложение пытается открыть Socket для определенного порта. Если другой экземпляр вашего приложения уже запущен, открытие Socket завершится неудачно.

Это уже должно быть достаточно для вас, поэтому вам не придется использовать ту часть кода, которая используется для регистрации новых приложений для первого запуска.

Использование сокета имеет одно большое преимущество по сравнению с записью какого-либо флага в файловую систему / реестр / что угодно:
Он удаляется даже в случае сбоя приложения.

1 голос
/ 27 марта 2010

Мое предпочтительное решение, как сказал Питер Лэнг, использовать Sockets. Когда ваше приложение запускается, вы можете запустить сокет сервера, прослушивающий входящие соединения на локальном хосте (плюс порт по вашему выбору). До того, как это произойдет в вашем коде, вы можете попытаться установить соединение с серверным сокетом, и если это успешно, вы знаете, что другой экземпляр уже открыт, поэтому вы можете выйти из текущего экземпляра с соответствующим сообщением.

В вашей реализации сокета сервера вы также можете добавить функциональность, которая при получении входящего соединения фактически вынуждает текущий экземпляр приложения на передний план.

1 голос
/ 27 марта 2010

На самом деле звучит так, будто вы хотите, чтобы за один раз открывалось только одно приложение . В таком случае, почему бы не снять блокировку файла или подобное при запуске приложения и проверить это при запуске. Головная боль (конечно) снимает эту блокировку в случае, если ваша программа не закрывается чисто.

0 голосов
/ 16 мая 2012

Используйте шаблон Singletone, как показано в примере !

0 голосов
/ 27 марта 2010

Вы имеете в виду запуск GUI как Singleton? Я делал это в прошлом, создав статический закрытый «менеджер представления», чтобы он был нулевым, не создавался и не отображался до первого создания графического интерфейса, после что, как и в случае с классическим синглтоном, графический интерфейс пользователя становится видимым при повторном запуске приложения ... У меня есть пара фреймворков, которые следуют этому дизайну. В этих платформах графический интерфейс не является «основным», есть также командная строка и подобные интерфейсы, поэтому графический интерфейс вызывается через командную строку ...

0 голосов
/ 27 марта 2010
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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...