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