2013-12-03 3 views
2

Я искал Google и StackOverflow совсем немного, и все они показывают, что с помощью:Предотвращение Закрытие JDialog от кнопки Выход

d.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 

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

if (gameArea.hitChest()) { 
    JDialog d = new JDialog((JFrame) gameArea.getTopLevelAncestor(), "Dialogue", true); 
    ChestLoot ch = new ChestLoot(player); 
    d.add(ch); 
    d.setSize(200, 100); 
    d.setVisible(true); 
    d.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 

    d.addWindowListener(new WindowAdapter() { 

     public void windowClosing(WindowEvent we) { 
      System.out.println("Don't Close!"); 
     } 

    }); 

    System.out.println("Should dispose here"); 
    TileIcon ches = gameArea.getCurrChest(); 
    gameArea.removeChest(ches); 
} 
+3

переместите 'd.setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE);' перед символом 'd.setVisible (true);'. Я рекомендую делать все в диалоговом окне, прежде чем устанавливать его видимым. – Justin

+0

@Quincunx Это исправило это, черт побери! Спасибо. –

+0

После вызова 'setVisible' будет показано диалоговое окно. Поскольку ваш диалог является модальным, этот метод вызывается с блоком до тех пор, пока диалог не будет закрыт; следовательно, все ваши вызовы после этой точки несколько бессмысленны ... –

ответ

1

Ваш JDialog является модальным, так что все после setVisible(true) не влияет на это. Переместить соответствующий код перед setVisible(true):

if (gameArea.hitChest()) { 
    JDialog d = new JDialog((JFrame) gameArea.getTopLevelAncestor(), "Dialogue", true); 
    ChestLoot ch = new ChestLoot(player); 
    d.add(ch); 
    d.setSize(200, 100); 

    d.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 

    d.addWindowListener(new WindowAdapter() { 

     public void windowClosing(WindowEvent we) { 
      System.out.println("Don't Close!"); 
     } 

    }); 

    d.setVisible(true); //code pauses here and waits for the dialog to be handled 

    System.out.println("Should dispose here"); 
    TileIcon ches = gameArea.getCurrChest(); 
    gameArea.removeChest(ches); 
} 

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

См JDialog, он говорит, что это:

диалог ввода блоков пользователей к другим окнам верхнего уровня, когда показано

Также упоминается в An Overview of Dialogs.

Смежные вопросы