Автоматично затваряне на Jdialog без действие на потребителя

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

За тази цел се опитах да използвам JDialog, както е показано по-долу:

    JOptionPane pane = new JOptionPane("Error message", JOptionPane.INFORMATION_MESSAGE);
    JDialog dialog = pane.createDialog("Error");
    dialog.addWindowListener(null);
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setVisible(true);
    Application.takeScreenshot();
    dialog.setVisible(false);

Чудех се дали има конкретен метод за затварянето му. Потърсих документацията и не мога да я намеря. Опитах се да намеря подходящ въпрос на SO, но не можах да намеря такъв, който да адресира моя проблем.

Чудя се дали има начин да се получи манипулаторът на прозореца и след това да се затвори с него или просто да се изпрати събитие "CLOSE" или "Press_ok" към прозореца?

Редактиране: Струва ми се, че кодът напълно спира да работи, когато се покаже полето за съобщения, сякаш има Thread.sleep(), докато прозорецът не бъде затворен ръчно от потребителя.

Ако е възможно, примерен код би бил полезен.

Благодаря


person user2863138    schedule 09.10.2013    source източник
comment
Моля, погледнете този прекрасен отговор, който със сигурност върши работата си по много по-добър начин :-)   -  person nIcE cOw    schedule 09.10.2013


Отговори (2)


Опитайте да използвате ScheduledExecutorService. Нещо като:

    JDialog dialog = pane.createDialog("Error");
    dialog.addWindowListener(null);
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor();     
sch.schedule(new Runnable() {
    public void run() {
        dialog.setVisible(false);
        dialog.dispose();
    }
}, 10, TimeUnit.SECONDS);

dialog.setVisible(true); 

[РЕДАКТИРАНЕ]

По отношение на коментара на camickr, в документацията не се споменава, че ScheduledExedcutorService се изпълнява в нишката за изпращане на събития. Така че по-добре да използвате swing.Timer

JDialog dialog = pane.createDialog("Error");
 dialog.addWindowListener(null);
 dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

Timer timer = new Timer(10000, new ActionListener() { // 10 sec
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(false);
                dialog.dispose();
            }
        });

        timer.start();

        dialog.setVisible(true); 
person Maxim Shoustin    schedule 09.10.2013
comment
може да има странични ефекти в Java7 за по-дълго забавяне, след което dialog.whatever ще бъде извикан от EDT - person mKorbel; 09.10.2013
comment
Добър съвет, никога не съм използвал повече от 20 секунди, имам док. справка? - person Maxim Shoustin; 09.10.2013
comment
docs.oracle.com/javase/7/docs/api/java/awt/ - person user2863138; 09.10.2013
comment
Всички актуализации на Swing трябва да се изпълняват на EDT. В документацията не се споменава, че ScheduledExedcutorService се изпълнява на EDT. Така че вместо това трябва да използвате Swing Timer. - person camickr; 09.10.2013

Успях да го оправя. Изглежда, че по подразбиране JDialog е модален, което означава, че прекъсва всичко останало, докато не бъде затворено от потребителя. За да поправя това, използвах метода:

dialog.setModalityType(Dialog.ModalityType.MODELESS);

Когато това е активно, прост .setVisible(false); е достатъчно. Както и да е, благодаря за помощта, съжалявам, че създавам ненужен въпрос, но се занимавах с часове, докато го намеря. Надяваме се, че може да помогне на другите.

person user2863138    schedule 09.10.2013
comment
Задаването на JDialog на false не е достатъчно, тъй като все още ще остане. Изхвърлянето му е правилният начин. Освен това примерът, цитиран в предоставената от мен връзка по-горе, не се придържа към това дали JDialog е модален или не. - person nIcE cOw; 10.10.2013