Всплывающее окно уведомления не запускается с одним экземпляром

Я хочу отображать всплывающее уведомление, когда пользователь пытается запустить приложение во второй раз, поэтому я создаю объект NotificationPop и вызываю метод для отображения диалогового окна в моем классе одного экземпляра, но он не отображает всплывающее окно, когда приложение запускается во второй раз. нет проблем с моим окном NotificationPop, оно работает нормально, однако, когда я вызываю его в одном экземпляре, оно не отображается. в окне вывода Netbeans отображается диалоговое окно, которое также закрыто. Я пропустил какой-либо шаг здесь?

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class SingleInstance {

    public static File f;
    public static FileChannel channel;
    public static FileLock lock;
    public static TrayCon trayobj;
    public static boolean checkstatus;
    public static NotificationPop obj;

    public static void main(String args[]) throws IOException {
        try {
            f = new File("key");
            if (f.exists()) {
                f.delete();
            }
            channel = new RandomAccessFile(f, "rw").getChannel();
            lock = channel.tryLock();
            if (lock == null) {
                obj = new NotificationPop();
                obj.displaypopupmessage();
                System.exit(0);
                channel.close();
                throw new RuntimeException("Only 1 instance can run");
            }

            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {

                    trayobj = new TrayCon();
                    trayobj.CreateTrayCon(trayobj);
                }
            });

        } catch (IOException ex) {
        }
    }
}

person mussdroid    schedule 25.08.2014    source источник
comment
Почему вы удаляете файл (особенно вне раздела блокировки)?   -  person MadProgrammer    schedule 25.08.2014
comment
вы имеете в виду, если фрагмент, позвольте мне добавить его туда,   -  person mussdroid    schedule 25.08.2014
comment
Я уверен, что я разместил здесь два (-три) различных кода в форме SSCCE/MCVE (самое важное) для одного экземпляра FileIO/Socket/???, из вашего кода невозможно что-то подсказать   -  person mKorbel    schedule 25.08.2014
comment
@mad программист, чтобы избежать дублирования, если файл уже существует в папке   -  person mussdroid    schedule 25.08.2014
comment
Этот вопрос может быть вам полезен: stackoverflow.com/questions/177189/   -  person icza    schedule 25.08.2014
comment
Вполне вероятно, что вызов System.exit(0) был сделан до того, как было показано ваше всплывающее окно с уведомлением... но у нас нет кода для того, чтобы быть уверенным на 100%...   -  person MadProgrammer    schedule 25.08.2014
comment
Если файл заблокирован, с чего вы взяли, что его можно удалить?   -  person MadProgrammer    schedule 25.08.2014
comment
@MadProgrammer конечно, требуется, потому что новый экземпляр JVM нужно убить, но этот вопрос снят в темноте   -  person mKorbel    schedule 25.08.2014
comment
@mKorbel Если OP хочет, чтобы файл был удален, когда существует первый экземпляр, то, пока он не использует deleteOnExit ... файл не может быть удален, пока он заблокирован ...: P   -  person MadProgrammer    schedule 25.08.2014
comment
О, кстати, когда я убрал ваш пример, он отлично работает ;)   -  person MadProgrammer    schedule 25.08.2014
comment
если не поставить выход из системы, диспетчер задач Windows полон запущенного процесса Java, каждый раз, когда пользователь запускает приложение, новый процесс Java создается в диспетчере задач Windows   -  person mussdroid    schedule 25.08.2014
comment
@MadProgrammer это правда, это хороший момент, но открытый файл нельзя удалить   -  person mKorbel    schedule 25.08.2014
comment
Хорошо, вам нужно, чтобы ваше всплывающее уведомление действовало как диалоговое окно. Остановите выполнение кода до тех пор, пока вы не отмените его или он не закроется, а ЗАТЕМ вызовите System.exit... опять же, у меня нет этого кода, я не могу сказать вам, что делать...   -  person MadProgrammer    schedule 25.08.2014
comment
Я знаю, что вы, ребята, профессионалы в этих темах, пожалуйста, немного уважайте таких младших инженеров, как я, поэтому, пожалуйста, напишите свой ответ и помогите мне :))   -  person mussdroid    schedule 25.08.2014
comment
да, мой класс всплывающих уведомлений отлично работает, когда он вызывается из других мест, даже здесь, если поместить его сверху, но при этом, если он не работает, пока я не удалю выход из системы, если я удалю выход из системы, создано несколько процессов Java, поэтому мое приложение несколько раз отстает   -  person mussdroid    schedule 25.08.2014
comment
Проблема в том, что кажется, что уведомление не является блокирующим вызовом, оно не блокирует поток выполнения, поэтому System.exit разрешено вызывать ДО того, как ваше уведомление даже отображается...   -  person MadProgrammer    schedule 25.08.2014
comment
Хорошо, я удалил системный выход, всплывающее окно работает нормально, но двоичный процесс Java (TM) Platform SE для каждого запущенного приложения создан новый JPSEB, который вы можете увидеть в диспетчере задач Windows dropbox.com/s/nrzy1ushnsyubnb/Windows%20Task%20Manager.PNG?dl=0   -  person mussdroid    schedule 25.08.2014
comment
Вам нужен какой-то способ скоординировать их... Вам нужно иметь возможность отображать уведомление, ждать, пока оно не будет скрыто, а ЗАТЕМ вызывать System.exit...   -  person MadProgrammer    schedule 25.08.2014
comment
это мне поможет? stackoverflow.com/questions/15747277/   -  person mussdroid    schedule 25.08.2014
comment
Только если вы знаете, как долго отображается уведомление. Возможно, было бы лучше иметь механизм обратного вызова, который позволил бы объекту уведомления отправлять обратно какое-то событие, сообщающее вызывающей стороне, когда уведомление отклонено...   -  person MadProgrammer    schedule 25.08.2014


Ответы (1)


хорошо, я добавил поток сна 6 секунд, исправил проблему

        if (lock == null) {

        obj = new NotificationPop();
        obj.proragramstatuswarning();
        Thread.sleep(6000);
        System.exit(0);
        channel.close();
        throw new RuntimeException("Only 1 instance can run");


    }
person mussdroid    schedule 25.08.2014