让JOptionPane消失

时间:2014-02-12 13:38:27

标签: java swing

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,但我尝试使用this作为组件,例如:JOptionPane.showConfirmDialog (this, "...",...)当用户点击“否”时,JOptionPane是唯一的东西这应该消失(所以我把它设置为:this.setVisible(false);)但是当我使用this时,即使主框架消失,所以我只想创建一个新的框架来满足我的需要。我无法将其设置为null,因为我需要它出现在屏幕的中心。如果有人可以告诉我如何处理这个问题,请做。

3 个答案:

答案 0 :(得分: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();
   }
}

修改

同样用setDefaultCloseOperation (EXIT_ON_CLOSE);替换setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);,否则无论windowClosing方法发生什么,主框架都会关闭。

答案 1 :(得分:1)

如果您不想隐藏else,请不要放frame。无论您单击是还是否,{​​{3}}都会自动消失。

答案 2 :(得分: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);
JOptionPane

旁注

为什么甚至有一个JDialog 一个JDialog?最终,JOptionPane只是一个自定义JFrame,它们具有相同的功能。


修改

如果您只想传递JOPtionPane作为MyFrameClass.this 传递

的参考
new JFrame()

而不是JDialog


<强> UDPATE

使用简单的自定义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(); } }); } } 测试此程序。

{{1}}