2014-02-12 5 views
0
public void windowClosing (WindowEvent e) 
    { 
     JFrame frame = new JFrame(); 

     int confirm = JOptionPane.showConfirmDialog (frame, "Exit game?", "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
     if (confirm == JOptionPane.YES_OPTION) 
     { 
      dispose(); 
     } 
     else 
     { 
      frame.setVisible(false); 
     } 
    } 

Поэтому, когда пользователь нажимает кнопку закрытия, появляется всплывающая панель JOptionPane. Когда пользователь нажимает «Нет», JOptionpane должен исчезнуть, а затем вернуться к кадру, который он изначально отображал, но с моим кодом, даже когда я нажимаю No, оба кадра, один для JOptionPane и тот, который он сидит на, исчезают.Замена JOptionPane

одно:

  • Я знаю, что я не должен создать новый JFrame для JOptionPane, но я попытался с помощью this для компонента, например: JOptionPane.showConfirmDialog (this, "...",...), когда пользователь нажимает на «Нет» JOptionPane является единственное, что должно исчезнуть (поэтому я установил его: this.setVisible(false);), но когда я использую this, даже основной кадр исчезает, поэтому я просто решил создать новый фрейм для удовлетворения моих потребностей. Я не могу установить его в null, потому что мне нужно, чтобы он отображался в центре экрана. Если кто-нибудь может посоветовать мне, как с этим справиться, пожалуйста.
+0

Почему вы делаете frame.setVisible (false)? Вам это действительно не нужно, JOptionPane исчезнет, ​​когда вы нажмете «да» или «нет». – hbsrud

+0

Является ли это «JDialog»? –

+0

Почему вы создаете новый JFrame? вы можете просто поставить 'null' как параметр fisrt' show confirm dialog' вместо этого. – kajacx

ответ

2

Это действительно просто, ваш кадр исчезнет, ​​потому что вы говорите, что это не должно быть видно, просто удалить, что еще:

public void windowClosing (WindowEvent e) {   
    int confirm = JOptionPane.showConfirmDialog (this, "Exit game?", "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 

    if (confirm == JOptionPane.YES_OPTION) { 
     dispose(); 
    } 
} 

EDIT:

Также замените setDefaultCloseOperation (EXIT_ON_CLOSE); с setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);, иначе основной кадр будет закрыт независимо от того, что происходит в методе windowClosing.

+0

Я сделал, но оба кадра все еще исчезают? = $ – user3026693

+0

А что, если вы поместите этот JFrame вне метода? – hbsrud

+0

Код в вашем ответе - это точный код, который у меня есть сейчас, и 'JOptionPane' и кадр все еще исчезают, даже когда я нажимаю no// Я не получаю никаких ошибок, я не знаю, что я делаю неправильно – user3026693

1

Только не ставьте else, если вы не хотите скрыть frame. JOptionPane исчезнет сам по себе, нажмете кнопку «Да» или «Нет».

1

Не создайте новый метод JFrame. Вот почему у вас есть случайный кадр, теперь.

public void windowClosing (WindowEvent e) 
{ 
    JFrame frame = new JFrame(); 

Передайте ссылку JFrame. Если выше код из JDialog вы можете сделать что-то вроде этого

public class MyDialog extends JDialog { 
    public MyDialog(final JFrame frame, boolean modal) { 
     super(frame, modal); 

     public void windowClosing (WindowEvent e) { 

      int confirm = JOptionPane.showConfirmDialog (frame, "Exit game?", "Are you sure?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
      if (confirm == JOptionPane.YES_OPTION) { 
       dispose(); 
      } 

     } 
    } 
} 

И только экземпляр JDialog, как это из вашего класса GUI с JFrame

MyDialog dialog = new MyDialog(thisFrame, true); 

Side Примечание

Почему даже есть JOptionPaneи a JDialog? В конечном счете, JDialog является обычным JOptionPane, они имеют одинаковую функциональность.


EDIT

Если вы просто хотите передать JFrame класс в качестве ссылки на JOPtionPane просто передать

MyFrameClass.this 

вместо new JFrame()


UDPATE

Протестируйте эту программу, используя простой обычай JDialog.

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class JDialogExample extends JFrame { 

    public JDialogExample() { 
     JButton exit = new JButton("Do you want to Exit?"); 
     exit.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       new HelloDialog(JDialogExample.this, true); 
      } 
     }); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(exit); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private class HelloDialog extends JDialog { 

     public HelloDialog(final JFrame frame, boolean modal) { 
      super(frame, modal); 

      JButton exit = new JButton("EXIT"); 
      JButton cancel = new JButton("CANCEL"); 

      setLayout(new GridLayout(2, 1)); 
      JPanel panel = new JPanel(); 
      panel.add(exit); 
      panel.add(cancel); 

      add(new JLabel("Do you want to exit?", JLabel.CENTER)); 
      add(panel); 

      exit.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.exit(0); 
       } 
      }); 
      cancel.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        dispose(); 
       } 
      }); 

      pack(); 
      setLocationRelativeTo(frame); 
      setVisible(true); 

     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new JDialogExample(); 
      } 
     }); 
    } 
} 
+0

Я использую 'JDialog' для иллюстрации сюжетной линии игры (графика и кнопки (используя .jpg файлы)), поэтому вместо создания новых кадров я просто использовал' JDialog' и 'JOptionPane' было проще использовать его, так как я просто хочу показать подтверждающий диалог для пользователя, когда он нажимает кнопку закрытия. – user3026693

+0

На данный момент я только пытаюсь использовать код на 'JFrame'. Я еще не добавил оконного прослушивателя в 'JDialog's – user3026693

+0

Проверьте мой ** ОБНОВЛЕНИЕ **. Он использует простой 'JDialog'. Посмотрите, сможете ли вы что-то извлечь из этого. –